题解 | #按之字形顺序打印二叉树#

按之字形顺序打印二叉树

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]);
        }
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务