defpre_order_trav(root: TreeNode):"""先序遍历, 根左右"""
stack =[]
ret =[]
cur = root
while stack or cur:if cur:
ret.append(cur.val)
stack.append(cur.right)
cur = cur.left
else:
cur = stack.pop()return ret
defpost_order_trav(root: TreeNode):"""后序遍历, 左右根"""
stack =[]
ret =[]
cur = root
while stack or cur:if cur:# 先输出为根右左
ret.append(cur.val)
stack.append(cur.left)
cur = cur.right
else:
cur = stack.pop()return ret[::-1]# 根右左 逆序变为 左右根
defin_order_trav(root: TreeNode):"""中序遍历, 左根右"""
stack =[]
ret =[]
cur = root
while stack or cur:if cur:
stack.append(cur)
cur = cur.left
else:
cur = stack.pop()
ret.append(cur.val)
cur = cur.right
return ret
4 层次遍历
(1) 递归实现
deflevel_order_trav(root: TreeNode):deftrav_level(node, level):if node isNone:return
ret[level-1].append(node.val)iflen(ret)== level:
ret.append([])# 遍历到新行之前, 添加新行
trav_level(node.left, level+1)
trav_level(node.right, level+1)
ret =[[]]# 每一个子列表保存了对应index层的从左到右的所有结点value值
trav_level(root,1)
rr =[i for r in ret for i in r]return rr
(2) 迭代实现
deflevel_order_trav(root: TreeNode):"""层次遍历"""
q =[root]
ret =[]while q:
node = q.pop(0)
ret.append(node.val)if node.left:
q.append(node.left)if node.right:
q.append(node.right)return ret