给你二叉树的根节点 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
解题思路
-
初始化:创建一个
lists
用于存储最终结果的列表,一个queue
用于进行广度优先遍历(BFS)。 -
处理空树:如果根节点为空,直接返回空列表。
-
遍历过程:
- 入队:将根节点加入
queue
中。 - 层级遍历:使用一个
while
循环遍历queue
,每次处理一个层级。- 记录层级大小:记录当前层级的节点数(即当前
queue
的大小)。 - 处理当前层级:遍历当前层级的所有节点,将节点值加入当前层级的列表中。
- 添加子节点:将当前节点的左子节点和右子节点(如果存在)加入
queue
中,准备下一层级的处理。
- 记录层级大小:记录当前层级的节点数(即当前
- 保存结果:将当前层级的节点值列表加入
lists
中。
- 入队:将根节点加入
-
返回结果:返回存储所有层级节点值的
lists
。
注释
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 创建一个列表,用于存储每一层的节点值列表
List<List<Integer>> lists = new ArrayList<>();
// 创建一个队列,用于广度优先遍历
Queue<TreeNode> queue = new LinkedList<>();
// 如果根节点为空,返回空列表
if(root == null) {
return new ArrayList<>();
}
// 将根节点加入队列
queue.add(root);
// 开始广度优先遍历
while (!queue.isEmpty()) {
// 记录当前层级的节点数
int size = queue.size();
// 创建一个列表,用于存储当前层级的节点值
List<Integer> list = new ArrayList<>();
// 遍历当前层级的所有节点
for (int i = 0; i < size; i++) {
// 从队列中取出一个节点
TreeNode index = queue.poll();
// 将节点值加入当前层级的列表中
list.add(index.val);
// 如果当前节点有左子节点,将左子节点加入队列
if (index.left != null) {
queue.add(index.left);
}
// 如果当前节点有右子节点,将右子节点加入队列
if (index.right != null) {
queue.add(index.right);
}
}
// 将当前层级的节点值列表加入结果列表
lists.add(list);
}
// 返回存储每一层节点值的列表
return lists;
}
}