easy 二叉树的后序遍历 递归 栈

在这里插入图片描述


递归:

c++


class Solution {
public:
    void postorder(TreeNode* root, vector<int> &res){ // &res给地址
        if(root == nullptr){  //  递归终止的条件为碰到空节点
            return;
        }
        postorder(root->left, res);   // 左
        postorder(root->right, res);  // 右
        res.push_back(root->val);  // 打印根
    }

    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        postorder(root,res);
        return res;
    }
};

python


class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        res=[]
        def postorder(root):
            if not root:
                return res;

            postorder(root.left)
            postorder(root.right)
            res.append(root.val)

        postorder(root)
        return res

在这里插入图片描述


栈:

c++


class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root == nullptr){
            return res;
        }
        stack<TreeNode*> stk;      // 创建一个栈
        TreeNode* prev = nullptr;  // 记录访问过的右子树
        while(!stk.empty() || root != nullptr){
            // 1.遍历到最左子节点
            while(root){
                stk.push(root);  // 当前遍历到的依次最左子节点入栈
                root = root->left;
            }  // 跳出循环时,当前最左节点下面已经没有节点 root=null
            
            // 2.遍历最左子节点的右子树(右子树存在 && 未访问过)
            root = stk.top();  // 开始回溯,栈顶为最左(底)的节点
            stk.pop();
            // 2.遍历最左子节点的右子树(右子树存在 && 未访问过)
            if(root->right && root->right != prev){
                stk.push(root);
                root = root->right;  // 下个while从该右节点开始找它的最左节点
            }else{   // 没有左右子树,或左右子树已经遍历完 打印
                res.push_back(root->val);
                prev = root;
                root = nullptr;
            }
        }
        return res;
    }
};

python


class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        if not root:
            return res
        stk = []
        prev = None

        while root or stk:
            ## 找到最左节点(下面已经无左子树 root=null)
            while root:
                stk.append(root)
                root = root.left

            root = stk[-1]   # stak.top()
            if root.right and root.right != prev:
                # 节点有右子树,下个while在右子树继续找最左节点
                root = root.right
            else:  # 节点没有左右子树,或者节点右子树遍历过
                res.append(root.val)
                prev = root   # 遍历过
                root = None   # 遍历过,则下一次不进入while
                stk.pop()
        return res

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值