题目
给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
返回其层序遍历结果:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
套用模板
广度优先搜索
BFS使用队列这一数据结构,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。
这里BFS总共有两个模板:
-
当不确定层数时:
while queue 不空: cur = queue.pop() for 节点 in cur的所有相邻节点: if 该节点有效且未访问过: queue.push(该节点)
-
需要确定层数时:
level表示当前遍历的二叉树层(或在一个图中,当前已经走了多少步);
size表示在当前遍历层的元素数,也就是队列中的元素数(把这些元素一次性遍历之后,即相当于当前层的所有元素都向外走了一步)。level = 0 while queue 不空: size = queue.size() while (size --) { cur = queue.pop() for 节点 in cur的所有相邻节点: if 该节点有效且未被访问过: queue.push(该节点) } level ++;
本题中,使用队列保存每层的所有节点,每次把队列里的原先所有节点进行出队列操作,再把每个元素的非空左右子节点进入队列。因此即可得到每层的遍历。
深度优先搜索
由于DFS 不是按照层次遍历,但本题需要让递归的过程中同一层的节点放到同一个列表中,于是在递归时记录每个节点的深度 level,递归到新节点将该节点放入 level 对应列表的末尾。
注:当遍历到一个新的深度 level,而最终结果 res 中还没有创建 level 对应的列表时,应该在 res 中新建一个列表用来保存该 level 的所有节点。
提交代码
广度优先搜索
# 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]]:
queue = collections.deque()
queue.append(root)
res = []
while queue:
size = len(queue)
level = []
for _ in range(size):
cur = queue.popleft()
if not cur:
continue
level.append(cur.val)
queue.append(cur.left)
queue.append(cur.right)
if level:
res.append(level)
return res
深度优先搜索
# 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]]:
res = []
self.level(root, 0, res)
return res
def level(self, root, level, res):
if not root:
return
if len(res) == level:
res.append([])
res[level].append(root.val)
if root.left:
self.level(root.left, level + 1, res)
if root.right:
self.level(root.right, level + 1, res)
总结
- 二叉树当层序遍历时为空的地方需要标注出来,反过来当给出链表还原二叉树也需要按照一定的规则输出;
- 用到二叉树深度和广度优先搜索方法时,套用模板,解题效果更佳。