#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。
- 感谢小明的递归讲解,太清晰明了了!!!
- 感谢图灵星球的后半部分讲解,从来没想过可以从开头加入呢!!