【Leetcode hot 100】102.二叉树的层序遍历
问题链接
102.二叉树的层序遍历
问题描述
给你二叉树的根节点 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),通过「队列」数据结构实现层级分隔:
- 队列特性:先进先出(FIFO),可保证同一层级的节点依次处理,且子节点按顺序进入下一层级。
- 层级控制:每次处理前,记录当前队列的大小(即当前层级的节点数),仅处理该数量的节点,确保每次循环对应一个完整层级。
- 边界处理:若根节点为
null
,直接返回空列表;若节点无左/右子树,跳过不入队。
完整代码实现
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;// 二叉树节点定义(LeetCode 题目已默认提供,此处为完整性展示)
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;}
}public class LevelOrderTraversal {public List<List<Integer>> levelOrder(TreeNode root) {// 结果列表:存储每一层的节点值List<List<Integer>> result = new ArrayList<>();// 边界条件:根节点为null,直接返回空结果if (root == null) {return result;}// 队列:用于BFS,存储待处理的节点(LinkedList实现Queue接口)Queue<TreeNode> queue = new LinkedList<>();// 根节点入队,启动BFSqueue.offer(root);// 循环处理队列,直到所有层级遍历完成while (!queue.isEmpty()) {// 1. 记录当前层级的节点数(关键:确保只处理当前层的节点)int currentLevelSize = queue.size();// 存储当前层级的节点值List<Integer> currentLevel = new ArrayList<>();// 2. 遍历当前层级的所有节点for (int i = 0; i < currentLevelSize; i++) {// 节点出队TreeNode node = queue.poll();// 将当前节点值加入当前层级列表currentLevel.add(node.val);// 3. 左子节点非null则入队(下一层级节点)if (node.left != null) {queue.offer(node.left);}// 右子节点非null则入队(下一层级节点)if (node.right != null) {queue.offer(node.right);}}// 4. 当前层级处理完毕,加入结果列表result.add(currentLevel);}return result;}// 测试用例(示例1)public static void main(String[] args) {LevelOrderTraversal solution = new LevelOrderTraversal();// 构建示例1的二叉树:root = [3,9,20,null,null,15,7]TreeNode root = new TreeNode(3);root.left = new TreeNode(9);root.right = new TreeNode(20);root.right.left = new TreeNode(15);root.right.right = new TreeNode(7);// 执行层序遍历List<List<Integer>> result = solution.levelOrder(root);// 输出结果(预期:[[3], [9,20], [15,7]])System.out.println(result);}
}
代码解释
- TreeNode 类:定义二叉树节点结构,包含值、左子树和右子树引用(LeetCode 环境中无需手动定义,此处为便于本地测试)。
- levelOrder 方法:
- 初始化:
result
存储最终结果,queue
用于BFS,根节点入队启动遍历。 - 层级循环:队列非空时,记录当前层级节点数
currentLevelSize
,确保仅处理当前层节点。 - 节点处理:弹出队列节点,加入当前层级列表;若存在左/右子节点,入队待处理(下一层级)。
- 结果收集:当前层级遍历完毕后,将其加入
result
。
- 初始化:
- main 方法:构建示例1的二叉树,调用
levelOrder
方法并输出结果,验证逻辑正确性。
复杂度分析
- 时间复杂度:
O(n)
,其中n
为二叉树节点总数。每个节点仅入队和出队一次,遍历次数与节点数成正比。 - 空间复杂度:
O(n)
,最坏情况下(满二叉树),队列需存储最后一层的所有节点(最多n/2
个),空间占用为O(n)
。