在二叉树算法面试的高频题库中,LeetCode 102 二叉树的层序遍历是当之无愧的“基础天花板”——它是广度优先搜索(BFS)思维在二叉树中的经典落地,不仅能考察你对队列数据结构的应用能力,更能体现对“分层遍历”核心逻辑的理解。据鳄鱼java社区2026年大厂面试数据统计,82%的一线互联网公司会将其作为二叉树环节的必考题,掌握它不仅能直接AC题目,更能快速迁移到“二叉树右侧视图”“分层求最大值”等变种题,是打开二叉树算法大门的关键钥匙。
一、层序遍历核心原理:为什么BFS是最优解?

层序遍历的定义是“从上到下、从左到右逐层访问二叉树的节点,并按层级返回节点值”,这种“横向遍历”的逻辑,天然契合BFS(广度优先搜索)的“先访问当前层所有节点,再进入下一层”的特性。
对比深度优先搜索(DFS)的递归遍历(前序、中序、后序),DFS是“纵向遍历”,需要额外记录节点的层级才能实现分层输出,而BFS借助队列的“先进先出”特性,无需额外标记层级即可自然实现分层: 1. 初始化队列,将根节点入队; 2. 每次遍历队列中当前所有节点(即当前层的节点数),将节点值存入当前层的结果列表; 3. 将当前层每个节点的左右子节点(如果存在)入队,为下一层遍历做准备; 4. 循环执行直到队列为空。
从时间复杂度看,两种遍历方式都是O(n)(每个节点仅被访问一次);但从空间复杂度看,BFS的队列最多存储一层节点(最坏情况为完全二叉树的最后一层,节点数约为n/2),而DFS的递归栈最坏情况为O(n)(链表型二叉树),因此BFS更适合处理深度较大的二叉树。
二、LeetCode 102 二叉树的层序遍历:两种经典实现方式
针对LeetCode 102要求“返回节点值的分层列表”,鳄鱼java社区的算法训练营主要教授两种经典实现方式,分别适配不同的面试场景:
1. 迭代解法(队列实现):面试标准解法
这是最直观、最常被面试官认可的解法,核心是通过队列记录当前层的节点数,确保每次循环只处理当前层的节点:
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue;class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } }
class Solution { public List<List
> levelOrder(TreeNode root) { List<List > res = new ArrayList<>(); if (root == null) return res; // 边界处理:空树直接返回 Queue 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); } res.add(currentLevel); } return res; }}
鳄鱼java社区的面试提示:面试中需要重点说明“为什么要记录当前层节点数”——如果不记录,会导致将下一层节点和当前层节点混在一起遍历,无法实现分层输出。这是90%初学者容易忽略的细节。
2. 递归解法:隐藏的分层思路
很多人认为层序遍历只能用BFS迭代实现,但实际上可以通过DFS递归+层级标记来完成,适合喜欢递归思维的开发者:
class Solution {
List> res = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return res;
dfs(root, 0); // 根节点层级为0
return res;
}
private void dfs(TreeNode node, int level) {
if (node == null) return;
// 如果当前层级对应的列表不存在,创建新列表
if (level == res.size()) {
res.add(new ArrayList<>());
}
res.get(level).add(node.val);
// 递归遍历左子树,层级+1
dfs(node.left, level + 1);
// 递归遍历右子树,层级+1
dfs(node.right, level + 1);
}
}
这种解法的核心是通过递归参数传递层级,将节点值添加到对应层级的列表中,时间复杂度同样为O(n),空间复杂度取决于递归栈深度(平衡二叉树为O(logn),链表型二叉树为O(n))。
三、面试高频变种:从LeetCode 102延伸的5类题目
掌握LeetCode 102的核心逻辑后,能快速解决5类高频变种题,据鳄鱼java社区统计,这些变种题的出现频率是原问题的3倍: 1. 二叉树右侧视图(LeetCode 199):层序遍历每层取最后一个节点; 2. 二叉树每层最大值(LeetCode 515):层序遍历每层求最大值; 3. 二叉树Z字形遍历(LeetCode 103):层序遍历,偶数层反转结果列表; 4. 二叉树最小深度(LeetCode 111):层序遍历遇到第一个叶子节点时,当前层级即为最小深度; 5. 二叉树序列化与反序列化(LeetCode 297):用层序遍历的顺序将二叉树序列化为字符串,反序列化时借助队列重建二叉树。
例如解决二叉树右侧视图时,只需在迭代解法的for循环中,判断是否为当前层的最后一个节点,若是则加入结果列表,无需额外修改核心逻辑。
四、常见陷阱:90%开发者容易犯的错误
鳄鱼java社区的学员数据显示,第一次练习LeetCode 102时,90%的开发者会踩以下陷阱: 1. 忘记空树处理:根节点为null时直接返回空列表,否则会出现空指针异常; 2. 不记录当前层节点数:直接遍历队列直到为空,导致结果是所有节点值的一维列表,而非分层列表; 3. 子节点入队顺序错误:先右后左会导致层序遍历顺序颠倒,违反题目“从左到右”的要求; 4. 递归层级计算错误:根节点层级设为1时,会导致res.size()判断错误,漏掉第一层或创建空列表。
比如一位鳄鱼java社区的学员,第一次面试时因为没记录当前层节点数,结果输出一维列表,被面试官指出后慌乱修改,最终错失offer。
五、实战迁移:层序遍历在实际项目中的应用
层序遍历的思维不仅适用于算法题,更能解决实际项目中的分层数据问题: 1. 组织机构树分层加载:企业级系统中,加载大型组织机构树时,采用层序遍历逐层加载节点,避免一次性加载所有数据导致内存溢出; 2. 前端树形组件渲染:Vue/React的树形组件中,用层序遍历实现“展开/折叠”的懒加载,提升页面渲染性能; 3. 网络爬虫广度优先抓取:爬虫中用层序遍历逐层抓取网页,避免陷入
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。





