图解题库 / 二叉树 · BFS

102. 二叉树的层序遍历

中等 含交互动画

学完这道你应该能: 说清它为什么用「BFS」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

逐层返回节点值,每层一个数组。

= 3 →(9, 20),20 →(15, 7)
输出 = [[3], [9,20], [15,7]]

思路解析

根先入队。每轮先记下当前队列里有几个(就是这一层的节点数),只处理这么多:依次出队、收集值、把孩子入队。处理完,队列里剩的正好是下一层。

第 1 层 · 出队 3:根 3 入队后出队,收集 [3]。把孩子 9、20 入队。队列现在是 [9, 20]——正好是第二层。

第 2 层 · 出队 9、20:本轮锁定 2 个:出队 9(无孩子)、出队 20(孩子 15、7 入队)。收集这一层 [9, 20]。队列变成 [15, 7]。

第 3 层 · 出队 15、7:出队 15、7(都是叶子,没孩子入队)。收集 [15, 7]。队列空了,遍历结束。

完成:三层依次收集,结果 [[3], [9,20], [15,7]]

凡是「按层处理 / 求每层信息 / 最短层数」都用 BFS:队列出一个入孩子、用 len(q) 切层。锯齿遍历、右视图、最小深度都是它的变体。

参考代码(Python)

Python
1if not root: return []
2q, res = deque([root]), []
3while q:
4    level = []
5    for _ in range(len(q)):        # 锁定这一层的个数
6        node = q.popleft(); level.append(node.val)
7        if node.left: q.append(node.left)
8        if node.right: q.append(node.right)
9    res.append(level)
10return res

复杂度分析

  • 时间复杂度:O(n) —— 每个节点进出队一次
  • 空间复杂度:O(n) —— 队列最多装一层

套路模板

记住骨架:队列起头、for range(len(q)) 锁层、出队处理、孩子入队。和多源 BFS(腐烂橘子)是同一个"按层"骨架。

Python
1q = deque([root])
2while q:
3    for _ in range(len(q)):        # 锁定当前层
4        node = q.popleft()
5        # 处理 node(收集值/记层)
6        if node.left: q.append(node.left)
7        if node.right: q.append(node.right)

易错点

  • 不锁 len(q) 直接 while → ✅ for _ in range(len(q)) 切层(不锁长度就分不清层与层的边界)
  • 入队前不判空 → ✅ if node.left 才入队(把 None 入队会在出队取值时报错)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →101. 对称二叉树 ← 返回题库