#145. 二叉树的后序遍历

#145. 二叉树的后序遍历 (递归与迭代)

题目

给定一个二叉树,返回它的后续遍历。(后续:左右中,中间节点在最后)

解答

###递归做法

如果当前根节点为空,返回空string,else返回traverse(左) + traverse(右) + [root.val]

class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return []
        return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]

迭代做法(大聪明做法)

OMG实在是太tm厉害了!用stack存将要遍历的节点,用result存遍历结果。

  • stack最初存有根节点,将stack的顶端pop成curr节点,并把curr节点的值加入result的第0位置
  • 往stack里边加入根节点的左,右子节点,这样pop出来就变成了依次添加 左,右,中,完成我们希望的后续遍历顺序。

任何往下延伸的子树都将在result的开头继续加入 左,右,中(原末端节点)。

收获

  • 递归做法的keypoint:分析一个树可以怎么构成,左子树,右子树,中间节点,同时分析左子树可能是什么,右子树可能是什么。-- 左子树或右子树有可能是None,因此以None作为递归的base case。
    • 感谢小明的递归讲解,太清晰明了了!!!
    • 感谢图灵星球的后半部分讲解,从来没想过可以从开头加入呢!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值