1.题目
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
BFS 通常借助 队列 的先入先出特性来实现
- 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
- 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
- BFS 循环:
- 当队列 queue 为空时跳出;
- 出队: 队首元素出队,记为 node;
- 打印: 将 node.val 添加至列表 tmp 尾部;
- 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
- 返回值: 返回打印结果列表 res 即可。
链接:参考
层次遍历:利用队列辅助
python可用
# 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[int]:
if not root:return []
queue,res=collections.deque(),[]
queue.append(root)
while queue:
node=queue.popleft()
res.append(node.val)
if node.left: queue.append(node.left)
if node.right:queue.append(node.right)
return res
2.题目
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
注意:新建一个临时列表 temp ,用于存储当前层打印结果;
当前层打印循环: 循环次数为当前层节点数(即队列 queue 长度);
# 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]]:
if not root:return []
queue,res=collections.deque(),[]
queue.append(root)
while queue:
temp=[]
for _ in range(len(queue)):
node=queue.popleft()
temp.append(node.val)
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
res.append(temp)
return res
3.题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
# 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]]:
if not root:return []
queue,res=collections.deque(),[]
queue.append(root)
while queue:
temp=collections.deque()
for _ in range(len(queue)):
node=queue.popleft()
if len(res)%2:
temp.appendleft(node.val)
else:
temp.append(node.val)
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
res.append(list(temp))
return res
tips:
python里
双向队列:queue=collections.deque()
可以有appendleft
(相当于从右往左添加了)和popleft(实现先进先出)的方法。
------------2021/01/17 collections.deque,BFS----------