102. 层序遍历#
从生活看遍历:层与层的对话#
想象一个社交派对。人们不是随机交谈,而是按楼层、按桌次有序互动。二叉树的层序遍历,正如这样一场有组织的社交盛宴,每一层都有自己独特的节奏和故事。
问题描述#
题目目标#
给你二叉树的根节点 root ,返回其节点值的层序遍历结果,即逐层地从左到右访问所有节点。
示例 1#
输入: root = [3,9,20,null,null,15,7]
输出: [[3],[9,20],[15,7]]
二叉树示意:
3
/ \
9 20
/ \
15 7text说明: 按层从左到右读取节点,结果就是 [[3],[9,20],[15,7]]。
补充说明#
- 二叉树通常使用层序数组表示,
null表示该位置没有节点。
层序遍历的本质#
层序遍历(LeetCode第102题)的核心:
- 自上而下,从根开始
- 同一层的节点依次访问
- 先进先出的队列管理
递归解法:有序的层次之旅#
public List<List<Integer>> levelOrder(TreeNode root) {
// 最终结果:按层存储每层节点值
List<List<Integer>> result = new ArrayList<>();
// 从根节点(第 0 层)开始递归收集
traverseLevel(root, 0, result);
// 返回层序遍历结果
return result;
}
private void traverseLevel(TreeNode node, int level, List<List<Integer>> result) {
// 递归终止条件:空节点不处理
if (node == null) return;
// 如果当前层的容器还不存在,先创建这一层的列表
if (level >= result.size()) {
result.add(new ArrayList<>());
}
// 把当前节点值加入它所属的层
result.get(level).add(node.val);
// 递归处理左子树,层号 +1
traverseLevel(node.left, level + 1, result);
// 递归处理右子树,层号 +1
traverseLevel(node.right, level + 1, result);
}java迭代解法:队列的精确编排#
public List<List<Integer>> levelOrder(TreeNode root) {
// 保存最终答案:每层一个列表
List<List<Integer>> result = new ArrayList<>();
// 边界处理:空树直接返回空结果
if (root == null) return result;
// 队列用于 BFS(先进先出,天然按层推进)
Queue<TreeNode> queue = new LinkedList<>();
// 根节点先入队
queue.offer(root);
// 队列不空表示仍有节点待访问
while (!queue.isEmpty()) {
// 固定当前层节点数量,避免与下一层混杂
int levelSize = queue.size();
// 存放当前层所有节点值
List<Integer> currentLevel = new ArrayList<>();
// 依次处理当前层节点
for (int i = 0; i < levelSize; i++) {
// 取出一个当前层节点
TreeNode node = queue.poll();
// 记录该节点值到当前层结果
currentLevel.add(node.val);
// 左孩子存在就入队,留到下一层处理
if (node.left != null) queue.offer(node.left);
// 右孩子存在就入队,留到下一层处理
if (node.right != null) queue.offer(node.right);
}
// 当前层处理完毕,加入总结果
result.add(currentLevel);
}
// 返回层序遍历结果
return result;
}java性能分析#
时间复杂度:O(n)#
- 每个节点访问一次
- 节点数量决定遍历时间
空间复杂度:O(w)#
- w为树的最大宽度
- 队列空间消耗
- 最坏情况可能接近O(n/2)
思考与拓展#
- 为什么队列适合层序遍历?
- 如何处理特殊二叉树?
- 还有哪些遍历方式?
应用场景#
- 网络拓扑分析
- 组织结构层级展示
- 状态机的层次遍历
- 图形用户界面的渲染
遍历的启示#
层序遍历教会我们:
- 有序胜于随机
- 系统性思考的重要性
- 复杂问题可以通过简单规则解决
记住,遍历树就像理解一个复杂系统,重要的是保持结构性思维!