LeetCode in Python 144. Binary Tree Postorder Traversal (二叉树的后序遍历)

本文详细解释了二叉树后序遍历的复杂性,比较了前序和中序遍历,并提供了递归和迭代两种实现方式,重点剖析了迭代过程中的栈操作和条件判断。
摘要由CSDN通过智能技术生成

二叉树后序遍历相较于前序和中序要相对复杂一些,主要原因在于,前序遍历只需特别关注根结点,中序遍历需要额外考虑左结点,而后序遍历不仅要记录左结点,根结点还需不断注意是否有右结点。出现这一变化的原因是后序遍历左右根遍历的特点。

示例1:

同样附上递归和迭代两种方法,需要着重注意迭代的过程。

代码:

递归法:

class Solution:
    def postorderTraversal(self, root):
        if root is None:
            return []
        return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]

迭代法:

class Solution:
    def postorderTraversal(self, root):
        stack = []
        result = []
        
        while root or stack:
            while root:
                stack.append(root)
                root = root.left
            temp = stack[-1].right
            if temp:
                root = temp     
            else:
                temp = stack.pop()
                result.append(temp.val)
               
                while stack and temp == stack[-1].right:
                    temp = stack.pop()
                    result.append(temp.val)
                    
        return result

代码说明:

(1) while root:
             stack.append(root)
             root = root.left

        这几步仍是将所有左子树的左结点压入栈中。
(2) temp = stack[-1].right
        当无左子树左结点时,要记录最后一个左结点的右结点,即栈顶元素的右结点。
(3) if temp:
             root = temp
        如果此时最后一个左结点有右孩子,则需把右孩子也压入栈中。
      else:
             temp = stack.pop()
             result.append(temp.val)
        否则说明该栈顶元素为一个根节点,已无左右孩子,只需弹出自己。
(4) while stack and temp == stack[-1].right:
             temp = stack.pop()
             result.append(temp.val)
        这个循环表示:弹出了栈顶结点后需要判断已弹出的这个结点是否为现在栈顶元素的右孩子。若是,表明当前栈顶元素也已无左右孩子,可以弹出。否则说明当前栈顶元素还存在右孩子 需要对其右孩子进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值