题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例
二叉树:[3,9,20,null,null,15,7],
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解题的思路
既然题目要求是按层序输出,容易想到的是BFS(Breadth First Search)方法。采取队列,将未遍历过的节点放入队列,然后从队列头部弹出节点——即变为遍历过的节点。
需要记忆的模板有如下两个(抄录并记忆):
- 不需要确定已经遍历到哪一层了
while queue 不为空:
当前节点 = queue.pop()
for 节点 in 当前节点的子节点:
if 该节点有效:
queue.push(该节点)
- 需要确定已经遍历到那一层了。这里就要加上level变量来记录层数
level = 0
while queue 不为空:
size = queue.size()
while size--:
当前节点 = queue.pop()
for 节点 in 当前节点的子节点:
if 该节点有效:
queue.push(该节点)
level++
从题目的输出要求来看,能解决本道题的是需要记录层数的模板2。
下面给出解答本题的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[List[int]]:
q = collections.deque()
q.append(root)
res = []
while q:
size = len(q)
level = []
for _ in range(size):
cur = q.popleft() #用来弹出最左侧的数,也可以使用pop(0)
if not cur:
continue
level.append(cur.val)
q.append(cur.left)
q.append(cur.right)
if level:
res.append(level)
return res
补充说明一点,collections 是 python 内建的一个集合模块,里面封装了许多集合类,其中队列相关的集合只有一个:deque。
deque 是双边队列(double-ended queue),具有队列和栈的性质。它的pop函数是默认弹出最右侧的一个元素,所以下面需要用到popleft函数。
写在最后
这是本人的第一篇博客,尝试着刷题之后做一点总结,方便日后再次记忆。本篇的思路是参照:负雪明烛的题解.写的的确很清晰,里面还有一个用DFS的解法,可以参考。
感谢您的阅读,本小白会继续写下去的!