题解 | #按之字形顺序打印二叉树#
按之字形顺序打印二叉树
https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0
思路
让我们以根节点为第一层,可知奇数层从左到右遍历,偶数层从右向左,我们可以参考上一题的代码,只不过在遍历每层节点时判断当前是偶数层还是奇数层
代码
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
// 创建集合
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
// 创建辅助队列
Queue<TreeNode> queue = new LinkedList<>();
if (pRoot != null) {
// 将根节点加入队列中
queue.add(pRoot);
}
// 层序遍历
Print(result, queue, 1);
// 返回结果
return result;
}
/**
* 对二叉树进行之字形层序遍历
*
* @param result 结果集合
* @param queue 当层辅助队列
* @param layers 当前层数
* @apiNote
* @since 2022/12/30 19:39
*/
public void Print(List<ArrayList<Integer>> result, Queue<TreeNode> queue,
int layers) {
// 统计本层节点数
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);
}
// 如果是偶数层,将结果集合反转
if (layers % 2 == 0) {
reverseArray(resultArray);
}
// 将本层结果集合加入结果集合中
result.add(resultArray);
// 层数递增
layers++;
// 继续下一层的层序遍历
Print(result, nextQueue, layers);
}
/**
* 反转集合
*
* @param resultArray 结果集合
* @apiNote
* @since 2022/12/30 19:43
*/
public void reverseArray(List<Integer> resultArray) {
// 计算结果集合长度
int size = resultArray.size();
// 创建辅助数组
Integer[] newArray = new Integer[size];
int count = 0;
for (Integer integer : resultArray) {
newArray[count++] = integer;
}
resultArray.clear();
// 反转集合
for (int i = count - 1; i >= 0; i--) {
resultArray.add(newArray[i]);
}
}
}