二叉树的迭代遍历 (最简洁)

二叉树的递归遍历比较简单易懂,但是迭代遍历方式需要一定的思考

一、二叉树前序遍历的迭代写法

class Solution {
public:
    //迭代写法
    //维持一个根左右的顺序
    vector preorderTraversal(TreeNode* root) {
        vectorres;
        stackstk;
        while(root||stk.size())
        {
            while(root)
            {
                res.push_back(root->val);
                stk.push(root);
                root=root->left;
            }
            root=stk.top()->right;  //此时root为栈顶,即最后一个左子树的叶子节点 开始遍历右节点的左子树
            stk.pop();  //弹栈
        }
        return res;
    }
};

二、二叉树后序遍历的迭代写法

后续遍历的迭代写法,就是左右根,就是前序遍历,稍微变形一下

class Solution {
public:
    //前序遍历的变形
    vector postorderTraversal(TreeNode* root) {
        vectorres;
        if(!root) return res;
        stackstk;
        while(root||stk.size())
        {
            while(root)
            {
                res.push_back(root->val);
                stk.push(root);
                root=root->right;
            }
            root=stk.top()->left;
            stk.pop();
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

三、二叉树中序遍历的迭代写法

class Solution {
public:
    //迭代的方法
    vector inorderTraversal(TreeNode* root) {
        vectorres;  //答案数组
        stackstk;  //栈
        while(root||stk.size())  //root不为空或栈不为空
        {
            while(root)  //root不为空
            {
                stk.push(root);  //先把根节点进入
                root=root->left; //再把节点的左子树进入
            }
    
            root=stk.top();   //取栈顶元素
            stk.pop();        
            res.push_back(root->val);  //加入答案数组里
            root=root->right; //root等于该节点的右节点
        }
        return res;
    }

};

你可能感兴趣的:(力扣,1024程序员节,数据结构,算法,c++)