当前位置: 首页 > article >正文

leetcode刷题(剑指offer) 103.二叉树的锯齿形层序遍历

103.二叉树的锯齿形层序遍历

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000]
  • -100 <= Node.val <= 100

解题思路与二叉树的层序遍历类似,我则是在遍历的基础上加了方向的标志位,依靠判断方向的标志位,对数组进行翻转。

代码如下:

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
		if (null == root) {
            return new ArrayList<>();
        }
        Queue<TreeNode> queue = new ArrayDeque<>();
        TreeNode lastNode = root;
        TreeNode nextLastNode = null;
        // 0 表示从左往右, 1表示从右往左
        int direction = 0;
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            list.add(node.val);
            if (node.left != null) {
                queue.add(node.left);
                nextLastNode = node.left;
            }
            if (node.right != null) {
                queue.add(node.right);
                nextLastNode = node.right;
            }


            if (node == lastNode) {
                lastNode = nextLastNode;
                if (direction == 1) {
                    Collections.reverse(list);
                }
                res.add(list);
                list = new ArrayList<>();
                direction = 1 - direction;
            }
        }
        return res;
    }

但是这种方法是不是太笨了呢,明明可以直接存好,还特意进行了依次翻转逻辑,所以参考了大佬的代码。

直接遍历每一层的节点,然后根据当前是层级的奇偶,来对数组进行前向添加数据和后向添加数据,代码如下:

public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if (root != null) {
            queue.add(root);
        }
        while (!queue.isEmpty()) {
            LinkedList<Integer> list = new LinkedList<>();
            // queue里面是一层所有的节点
            for (int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                if (res.size() % 2 == 0) {
                    list.addLast(node.val);
                } else {
                    list.addFirst(node.val);
                }
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            res.add(list);
        }
        return res;
    }

http://www.kler.cn/a/226390.html

相关文章:

  • 《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第6章 逻辑斯谛回归与最大熵模型(1)6.1 逻辑斯谛回归模型
  • Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询
  • 什么是ISO21434网络安全中的信息安全?-亚远景
  • sklearn.preprocessing 标准化、归一化、正则化
  • [C++]类和对象(中)
  • C++类和对象入门(二)
  • DockerCompose+SpringBoot+Nginx+Mysql实践
  • 正点原子--STM32定时器学习笔记(1)(更新中....)
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TimePicker组件
  • 【Spark系列6】如何做SQL查询优化和执行计划分析
  • 三步实现 Sentinel-Nacos 持久化
  • Redis常用数据类型--Hash
  • C#学习笔记_继承
  • vue-3d-model
  • 极限存在法则【高数笔记】
  • 八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Implicit GEMM conv)
  • C++:输入流/输出流
  • SpringBoot security 安全认证(三)——自定义注解实现接口放行配置
  • MyBatis常见面试题汇总
  • 云原生 API 网关链路追踪能力重磅上线