当前位置:首页 > 力扣题解 > 力扣145题:二叉树的后序遍历, 解题思路与C++实现

力扣145题:二叉树的后序遍历, 解题思路与C++实现

2周前 (05-19)力扣题解59

截图未命名.jpg 力扣145题:二叉树的后序遍历, 解题思路与C++实现 算法 力扣 C++ 二叉树遍历 二叉树 迭代 栈 递归 后序遍历 第1张

题目介绍

力扣第145题要求实现一个函数,该函数接收一个二叉树的根节点,并返回该树的后序遍历结果。后序遍历是一种遍历二叉树的算法,其顺序为:先遍历左子树,是右子树,是根节点。

解题思路分析

解题时,我们可以使用递归迭代的方法。递归方法较为直观,但可能导致溢出。迭代方法可以使用栈来模拟递归过程,避免栈溢出的问题。

递归方法的核心在于递归地访问左子树和右子树,访问根节点。迭代方法则需要两个栈来存储遍历过程中的节点,一个用于模拟递归的顺序,另一个用于存储遍历结果。

递归方法实现

以下是使用递归方法实现的C++代码。递归方法简单易懂,但需要注意递归深度限制。

class Solution {
public:
    vector<int> postorderTraversal(TreeNode root) {
        vector<int> result;
        postOrder(root, result);
        return result;
    }

    void postOrder(TreeNode node, vector<int>& result) {
        if (!node) return;
        postOrder(node->left, result);
        postOrder(node->right, result);
        result.push_back(node->val);
    }
};

迭代方法实现

以下是使用迭代方法实现的C++代码。这种方法使用两个栈来模拟递归过程,避免了递归深度限制的问题。

class Solution {
public:
    vector<int> postorderTraversal(TreeNode root) {
        vector<int> result;
        stack<TreeNode> s1, s2;
        if (!root) return result;
        s1.push(root);
        while (!s1.empty()) {
            TreeNode node = s1.top();
            s1.pop();
            s2.push(node);
            if (node->left) s1.push(node->left);
            if (node->right) s1.push(node->right);
        }
        while (!s2.empty()) {
            result.push_back(s2.top()->val);
            s2.pop();
        }
        return result;
    }
};

原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。