145. 二叉树的后序遍历
https://leetcode-cn.com/problems/binary-tree-postorder-traversal/
解法一:递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = []
self.travel(root, res)
return res
def travel(self, root, res): #辅助函数,注意要将结果集作为参数传入,才能在递归中修改结果集
if root:
self.travel(root.left, res)
self.travel(root.right, res)
res.append(root.val)解法二:用栈。
左右中的顺序,关键是判断左右是否已访问,且是先左后右,才能访问中。用cur表示当前访问,last表示上一次访问。
初始将根放入栈,last初始为根
每次令cur为当前栈顶,但是不弹栈
1)若cur左子非空,且cur左子和右子都不为last,则cur的左子入栈。解释:last是最近弹栈并输出的节点,若last等于cur的左子或右子,说明cur的左子树和右子树都已输出,此时不应将cur的左子入栈。否则说明左子树还没处理,将cur的左子入栈
2)若1不成立,且cur的右子非空,last不为cur的右子,则cur的右子入栈。解释:若last为cur的右子,说明cur的右子已输出,此时不应再将cur的右子入栈,否则说明右子树还没处理,要将cur的右子入栈
3)若1和2都不成立,说明cur的左子和右子都已输出,则将cur弹栈,并将cur标记为last
最后更新于