题解 | #求二叉树的层序遍历#
求二叉树的层序遍历
https://www.nowcoder.com/practice/04a5560e43e24e9db4595865dc9c63a3
思路
本题主要难点在于如何将当层遍历结果组成集合加入到结果集
利用队列来进行层序遍历,每当进行一层遍历时,统计当前队列中节点数创建相应大小本层结果集合进行接收,出队时,将出队节点子节点加入下层队列中 步骤:
主方法:
- 创建一个结果集合,创建一个初始辅助队列,并在根节点判空后将根节点加入队列中
- 将结果集合与辅助队列传入层序遍历方法中
- 返回结果集合
层序遍历方法:
- 统计本层队列节点总数,如果节点数等于0直接返回(方法出口),通过节点数创建相应大小的本层结果集合
- 创建下层层序遍历所需要的辅助队列(这样就分离开了本层辅助队列与下层辅助队列)
- 使用while循环,循环中先将弹出节点的左右子节点加入下层辅助队列中(如果该节点左右子节点存在的话),将当前节点值加入本层结果集合中,并弹出该节点
- while循环结束后,将本层结果集合加入到传入的结果集合中,递归调用该方法,传入结果集合与下层辅助队列(也可以将方法出口设置在此)
- 直到下层辅助队列为空(即本层队列节点总数为0)时,层序遍历结束,返回结果集合
代码
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
* @param root TreeNode类
* @return int整型ArrayList<ArrayList <>>
*/
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
// 创建集合
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
// 创建辅助队列
Queue<TreeNode> queue = new LinkedList<>();
if (root != null) {
// 将根节点加入队列中
queue.add(root);
}
// 层序遍历
levelOrder(result, queue);
// 返回结果
return result;
}
/**
* 对二叉树进行层序遍历
*
* @param result 遍历结果集合
* @param queue 辅助队列
* @apiNote
* @since 2022/12/29 20:52
*/
public void levelOrder(List<ArrayList<Integer>> result, Queue<TreeNode> queue) {
// 统计本层节点数
int size = queue.size();
if (size == 0) {
return;
}
// 创建本层结果集合
ArrayList<Integer> resultArray = new ArrayList<>(size);
// 创建下层辅助队列
Queue<TreeNode> nextQueue = new LinkedList<>();
// 弹出队列节点
while (!queue.isEmpty()) {
// 将弹出节点的左右节点加入新队列中
if (queue.peek().left != null) {
nextQueue.add(queue.peek().left);
}
if (queue.peek().right != null) {
nextQueue.add(queue.peek().right);
}
// 将当前节点值加入本层结果集合中
resultArray.add(queue.poll().val);
}
// 将本层结果集合加入结果集合中
result.add(resultArray);
// 继续下一层的层序遍历
if (!nextQueue.isEmpty()) {
levelOrder(result, nextQueue);
}
}
}