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

前序遍历

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

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 @ 2025-02-17 00:50  Tshaxz  阅读(32)  评论(0)    收藏  举报
Language: HTML