0
点赞
收藏
分享

微信扫一扫

#145. 二叉树的后序遍历

迪莉娅1979 2022-03-11 阅读 74

#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 条评论