树的后序遍历递归迭代做法LeetCode145

题意

给定一个二叉树,返回后序遍历

递归方法

只要确定好递归出口和递归操作流程即可,代码如下:

void posttravel(TreeNode* root, vector<int>& res)
    {
        if(root == nullptr) return;

        if(root->left != nullptr) posttravel(root->left, res);
        if(root->right != nullptr) posttravel(root->right, res);
        res.push_back(root->val);
    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        posttravel(root, res);
        return res;
    }

迭代方法

方法一:

后序遍历的序列满足:左右根, 我们可以修改先序遍历的序列顺序,然后翻转即可,代码如下:

vector<int> postorderTraversal(TreeNode* root)
    {
        vector<int> res;
        if(root == nullptr) return res;

        stack<TreeNode*> s;
        s.push(root);

        while(!s.empty())
        {
            TreeNode* temp = s.top();
            s.pop();
            res.push_back(temp->val);

            if(temp->left != nullptr) s.push(temp->left);  //左节点先进栈,后处理
            if(temp->right != nullptr) s.push(temp->right); //右节点后进栈,先处理
        }

        reverse(res.begin(), res.end());
        return res;
    }

方法二:显式模拟进栈出栈的过程

vector<int> postorderTraversal(TreeNode *root) {
        vector<int> res;
        if (root == nullptr) {
            return res;
        }

        stack<TreeNode*> stk;
        TreeNode* prev = nullptr;
        while (root != nullptr || !stk.empty()) {
            while (root != nullptr) {
                stk.emplace(root);
                root = root->left;
            }
            root = stk.top();
            stk.pop();
            if (root->right == nullptr || root->right == prev) {
                res.emplace_back(root->val);
                prev = root;
                root = nullptr;
            } else {
                stk.emplace(root);
                root = root->right;
            }
        }
        return res;
    }
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页