一、思路
二叉树的层序遍历是一种**广度优先搜索(BFS)**的应用,它按照树的层次顺序遍历节点。
我们可以借助队列先进先出的特点,某一层的元素依次加入队列后,出队列时,对于每一个元素,我们都将它的左右子节点再依次入队,从而下一层的队列也保持层序遍历的顺序。
具体的思路如下:
- 首先创建一个队列(通常使用队列的数据结构),并将根节点放入队列中。
- 当队列不为空时,执行以下步骤:
- 从队列中取出当前节点,并将其值添加到当前层的列表中。
- 如果当前节点有左子节点,则将左子节点加入队列。
- 如果当前节点有右子节点,则将右子节点加入队列。
- 重复上述步骤,直到队列为空。
- 将当前层的列表添加到最终的结果列表中。
- 重复步骤2和3,直到遍历完整棵树。
通过这个过程,我们可以按层次顺序遍历二叉树的所有节点,并将它们按层次分组存储在结果列表中。
层序遍历的关键在于使用队列来存储待处理的节点,确保按照节点的顺序依次处理。这样可以保证在遍历当前层之前,所有上一层的节点都已经被处理过,从而实现按层次遍历的效果。
二、示例代码
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>(); // 存储最终结果的列表
ArrayDeque<TreeNode> que = new ArrayDeque<>(); // 用于按层次顺序处理树节点的队列
if (root == null) return result; // 如果根节点为空,直接返回结果列表
que.addLast(root); // 将根节点添加到队列中
while(!que.isEmpty()){ // 当队列不为空时,继续处理节点
int size = que.size(); // 当前层的节点数量
List<Integer> level = new ArrayList<>(); // 存储当前层节点值的列表
while(size > 0){ // 遍历当前层的所有节点
TreeNode node = que.removeFirst(); // 从队列中移除并获取第一个节点
level.add(node.val); // 将节点值添加到当前层的列表中
if(node.left != null) que.addLast(node.left); // 如果节点有左子节点,则将左子节点加入队列
if(node.right != null) que.addLast(node.right); // 如果节点有右子节点,则将右子节点加入队列
size--; // 当前层节点数量减一
}
result.add(level); // 将当前层的节点值列表添加到结果列表中
}
return result; // 返回结果列表
}
}