之前写过一篇关于二叉树遍历的文章,文章中遍历结果借用yield
,generator
生成一系列的迭代值,用来节省内存空间。
本文是近来刷题的总结。
将二叉树的前中后序遍历的迭代和递归方法,采用最为简单直接的方法实现。
解法一:采用简单的递归,需要辅助函数
解法二:借用栈结构,将访问过的节点,置一以此避免嵌套循环,做到简单直观
解法三:解法二的优化,直接判断节点的属性即可,TreeNode
or int
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
# # 解法一 递归
# self.res=[]
# self.inorder(root)
# return self.res
# def inorder(self,root):
# if not root :
# return []
# self.inorder(root.left)
# self.res.append(root.val)
# self.inorder(root.right)
# # 解法二 迭代 颜色法 访问过的置1
# WHITE,GRAY=0,1
# res,stack=[],[(WHITE,root)]
# while stack:
# color,node=stack.pop()
# if node is None:
# continue
# if color==WHITE:
# # tip1:挨个带入
# # stack.append((WHITE,node.right))
# # stack.append((GRAY,node))
# # stack.append((WHITE,node.left))
# # tip2 拼接带入 简练但是速度慢
# stack.extend([(WHITE,node.right),(GRAY,node),(WHITE,node.left)])
# else:
# res.append(node.val)
# return res
# 解法三 类型判断性
res,stack=[],[root]
while stack:
node=stack.pop()
if isinstance(node,TreeNode):
stack.extend([node.right,node.val,node.left])
elif isinstance(node,int):
res.append(node)
return res
层序遍历:BFS 输出结果是每层一个数组结构
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
# 解法 二叉树的分层打印
from collections import deque
if not root: return []
res=[]
q=deque()
q.append(root)
while q:
tmp=[]
# 循环每一层的节点
for _ in range(len(q)): # pop出每一层的节点 将其放入tmp中 将每个节点的左右节点放入
a=q.popleft()
tmp.append(a.val)
if a.left: q.append(a.left)
if a.right: q.append(a.right)
res.append(tmp)
return res