https://leetcode.com/problems/binary-tree-postorder-traversal/description/
二叉树后序遍历
思路1:递归
# 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):
"""
:type root: TreeNode
:rtype: 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)
思路2:用栈。左右中的顺序,关键是判断左右是否已访问,且是先左后右,才能访问中。用cur表示当前访问,last表示上一次访问。
class Solution:
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res = []
stack = []
cur = root
last = None
while cur: #先到达最左
stack.append(cur)
cur = cur.left
while len(stack) > 0:
cur = stack.pop()
#右子不存在或已访问,可以访问父节点
if not cur.right or cur.right == last:
res.append(cur.val)
last = cur #更新记录
#否则访问右子树
else:
stack.append(cur)
cur = cur.right
while cur: #继续到达最左
stack.append(cur)
cur = cur.left
return res