102.二叉树的层序遍历- 力扣(LeetCode)
题目:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
-
树中节点数目在范围 [0, 2000] 内
-
-1000 <= Node.val <= 1000
思路如下:
广度优先搜索(BFS),可以使用两个数组或使用一个队列来辅助完成。
题解如下:
#两个数组
class Solution:
def levelOrder(self, root):
"""
:type: root: Optional[TreeNode]
:rtype: List[List[int]]
"""
if root is None:
return []
ans = []
cur = [root]
while cur:
nxt = [] # 存储下一层的节点
vals = [] # 存储当前层的节点值
for node in cur:
vals.append(node.val) # 收集当前层节点的值
if node.left: nxt.append(node.left) # 左子节点加入下一层
if node.right:nxt.append(node.right) # 右子节点加入下一层
cur = nxt # 更新当前层为下一层
ans.append(vals) # 将当前层结果加入最终列表
return ans
#一个队列
class Solution:
def levelOrder(self, root):
"""
:type: root: Optional[TreeNode]
:rtype: List[List[int]]
"""
if root is None:
return []
ans = []
q = deque([root])
while q:
vals = []
for _ in range(len(q)): # 固定当前层的节点数量
node = q.popleft() # 弹出队列最左侧节点(先进先出)
vals.append(node.val)
if node.left: q.append(node.left) # 左子节点加入队列
if node.right:q.append(node.right) # 右子节点加入队列
ans.append(vals)
return ans
示例流程:
1
/ \
2 3
/ \
4 5
#两个数组
第1层:cur = [1] → vals = [1] → nxt = [2, 3] → ans = [[1]]
第2层:cur = [2, 3] → vals = [2, 3] → nxt = [4, 5] → ans = [[1], [2, 3]]
第3层:cur = [4, 5] → vals = [4, 5] → nxt = [] → ans = [[1], [2, 3], [4, 5]]
最终结果:[[1], [2, 3], [4, 5]]。
#一个队列
第1层:q = [1] → 处理 1 → vals = [1] → q = [2, 3] → ans = [[1]]
第2层:q = [2, 3] → 处理 2, 3 → vals = [2, 3] → q = [4, 5] → ans = [[1], [2, 3]]
第3层:q = [4, 5] → 处理 4, 5 → vals = [4, 5] → q = [] → ans = [[1], [2, 3], [4, 5]]
最终结果:[[1], [2, 3], [4, 5]]。