文章目录
一、题目概述
题目链接:
LeetCode - Binary Tree Level Order Traversal(层序遍历)
题目描述:
给定一个二叉树的根节点 root,返回其节点值的层序遍历。即:按从上到下、从左到右的顺序访问所有节点。
示例:
假设我们有如下二叉树:
3
/ \
9 20
/ \
15 7
则层序遍历的结果为:
[
[3],
[9,20],
[15,7]
]
二、问题理解与思维导图
层序遍历是一种典型的 广度优先搜索(BFS) 问题。BFS 从根节点开始,逐层向下遍历整棵树。
下面用一个 Mermaid 思维导图 帮助理解问题及解题思路:
三、解题思路详解
1. 迭代法(BFS思路)
原理:
我们使用一个 队列(Queue) 来按层处理节点:
- 首先将根节点入队;
- 当队列不为空时,说明还有层未处理;
- 每次循环时,记录当前队列的大小(即当前层节点数量);
- 依次取出当前层的节点,并将它们的子节点入队;
- 将每层的节点值存入结果列表。
示意流程图:
关键点:
- 使用队列保证节点访问顺序;
- 通过控制当前层的节点数量来分层处理;
- 每次循环都生成一个对应层的结果列表。
2. 递归法(DFS思路)
原理:
虽然层序遍历通常用 BFS 实现,但我们也可以用 递归(DFS) 来实现:
- 在递归函数中传入当前层数
level; - 在访问节点时,如果
result列表中还没有当前层的子列表,则新建一个; - 将当前节点值加入对应层的列表;
- 递归访问左子树、右子树,层数加1。
递归调用时序图:
这种方式利用递归调用深度记录层数,避免显式队列结构。
四、代码实现(Java)
1. 迭代法实现
import java.util.*;
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
result.add(level);
}
return result;
}
}
2. 递归法实现
import java.util.*;
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
dfs(root, 0, result);
return result;
}
private void dfs(TreeNode node, int level, List<List<Integer>> result) {
if (node == null) return;
if (result.size() == level) {
result.add(new ArrayList<>());
}
result.get(level).add(node.val);
dfs(node.left, level + 1, result);
dfs(node.right, level + 1, result);
}
}
五、复杂度分析
| 项目 | 迭代法 | 递归法 |
|---|---|---|
| 时间复杂度 | O(n) | O(n) |
| 空间复杂度 | O(n)(队列存放节点) | O(n)(递归调用栈深度) |
其中 n 为二叉树的节点总数。
每个节点都被访问一次,因此时间复杂度均为 O(n)。
六、总结与延伸
- 层序遍历的本质是 广度优先搜索(BFS);
- 队列是实现层序遍历的关键数据结构;
- DFS 版本提供了更递归的视角,适合理解层级关系;
- 层序遍历是许多二叉树延伸操作(如右视图、最小层深度等)的基础。
扩展题:
- 二叉树的 Zigzag 层序遍历(LeetCode 103)
- 二叉树的最小深度(LeetCode 111)
——102. 二叉树的层序遍历&spm=1001.2101.3001.5002&articleId=157479557&d=1&t=3&u=7499b7f61f894cf5b28001f3c81625ba)
1万+

被折叠的 条评论
为什么被折叠?



