【二叉树】前、中、后序遍历的迭代写法

前序遍历

前序与后序代码几乎完全相同,唯一区别是入栈的顺序,前序入栈右左根,出栈为根左右
后序入栈左右根,出栈为根右左,然后再反转一下就是后序遍历的左右根

class Solution {
public:
    vector<int> res;
    vector<int> preorderTraversal(TreeNode* root) {
        if (!root) return res;
        stack<TreeNode*> stk;
        stk.push(root);
        while (stk.size())
        {
            TreeNode* t = stk.top();
            stk.pop();
            res.push_back(t->val);//根最先入栈
            //按右左顺序入栈,出栈时才是左右
            if (t->right) stk.push(t->right); 
            if (t->left) stk.push(t->left);
        }
        return res;
    }
};

后序遍历

class Solution {
public:
    vector<int> res;
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> stk;
        if (!root) return res;
        stk.push(root);
        while (stk.size())
        {
            TreeNode* t = stk.top();
            stk.pop();
            res.push_back(t->val);
            if (t->left) stk.push(t->left);//本句及下句顺序与前序遍历相反
            if (t->right) stk.push(t->right);
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

中序遍历

中序与前后序不一样,需要先把左子树一直入栈,直到左下角,然后再遍历根节点,然后遍历右子树

class Solution {
public:
    vector<int> res;
    vector<int> inorderTraversal(TreeNode* root) {
        stack<TreeNode*> stk;
        while (root || stk.size())
        {
            if (root)
            {
                stk.push(root);
                root = root->left;
            }
            else
            {
                root = stk.top(); stk.pop();
                res.push_back(root->val);
                root = root->right;
            }
        }
        return res;
    }
};
posted @   Tshaxz  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
Language: HTML
点击右上角即可分享
微信分享提示