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.hqwc.cn/news/448260.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android矩阵Matrix裁切setRectToRect拉伸Bitmap替代Bitmap.createScaledBitmap缩放,Kotlin

Android矩阵Matrix裁切setRectToRect拉伸Bitmap替代Bitmap.createScaledBitmap缩放&#xff0c;Kotlin class MyImageView : AppCompatImageView {private var mSrcBmp: Bitmap? nullprivate var testIV: ImageView? nullconstructor(ctx: Context, attrs: AttributeSet) :…

Java对象属性设置方式

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 对象属性设置方式 直接赋值 SystemMappingCode systemMappingCode new SystemMappingCode();systemMappingCode.setCodeResp(request.getCodeResp());systemMapping…

Unity使用反向遮罩实现镂空shader

实现步骤&#xff1a; 1&#xff0c;创建两个材质球&#xff0c;遮罩层的属性如下&#xff1a; 被遮罩层的属性如下&#xff1a; 2&#xff0c;使用两张image&#xff0c;遮罩层在父节点&#xff0c;被遮罩层在子节点&#xff0c;然后分别添加材质球与镂空图片 实现效果如下&a…

Android.bp入门指南之浅析Android.bp文件

文章目录 Android.bp文件是什么&#xff1f;Android.bp的主要作用模块定义依赖关系构建规则模块属性插件支持模块的可配置性 为什么会引入Android.bp语法例子 Android.bp文件是什么&#xff1f; Android.bp 文件是 Android 构建系统&#xff08;Android Build System&#xff…

JS高级(二)-深入对象、内置构造函数、综合案例

文章目录 1.深入对象1.1创建对象的三种方式1.2构造函数1.3实例成员1.4静态成员 2.内置构造函数2.1 Object2.2 Array2.3显示赠品案例2.4包装类型2.4.1 String2.4.2 Number 3.综合案例——购物车展示 1.深入对象 了解面向对象的基础概念&#xff0c;能够利用构造函数创建对象。 1…

踩坑STM32CubeMX生成Makefile工程无法使用printf(“%f“)

过去一年偶有接触STM32开发时都是使用STM32CubeMX生成Makefile的工程&#xff0c;具体开发环境见配置Clion用于STM32开发&#xff08;Makefile&#xff09;&#xff0c;但没想到今天在使用printf打印输出浮点数时无法正常输出&#xff0c;不仅printf无法使用&#xff0c;其他涉…

SpringFramework实战指南(五)

SpringFramework实战指南(五) 4.3 基于 注解 方式管理 Bean4.3.1 实验一: Bean注解标记和扫描 (IoC)4.3.2 实验二: 组件(Bean)作用域和周期方法注解4.3.3 实验三: Bean属性赋值:引用类型自动装配 (DI)4.3.4 实验四: Bean属性赋值:基本类型属性赋值 (DI)4.3.5 实验五:…

尚硅谷Ajax笔记

一天拿下 介绍二级目录三级目录 b站链接 介绍 ajax优缺点 http node.js下载配置好环境 express框架 切换到项目文件夹&#xff0c;执行下面两条命令 有报错,退出用管理员身份打开 或者再命令提示符用管理员身份打开 npm init --yes npm i express请求 <script>//引…

线上排查问题常用K8s命令

线上排查问题常用K8s命令 1 获取类 kubectl get po&#xff1a;获取默认namespace下节点信息 获取默认Default命名空间下的节点信息 kubectl get ns&#xff1a;获取所有命名空间 kubectl get po -n ziyi&#xff1a;获取指定namespace下的节点信息 kubectl get po -A&#x…

项目安全问题及解决方法------用户密码处理

我们一般来说是不保存原始密码&#xff0c;这样即使被拖库也不会造成用户数据损失&#xff0c;一般来说我们通常会使用 MD5 加密后保存&#xff0c;但是大家对于MD5是使用是否 是正确的呢&#xff1f;MD5 其实不是真正的加密算法。所谓加密算法&#xff0c;是可以使用密钥把明文…

【Uni-App】运行微信小程序时报错routeDone with a webviewId 2 that is not the current page

使用HBuilderX开发微信小程序&#xff0c;运行项目的时有可能会出现routeDone with a webviewId 1 that is not the current page的报错&#xff0c;但不影响运行。如果强迫症介意的话&#xff0c;可以考下面的方法进行修复。 产生原因 由于微信开发者工具的调试基础库处于灰度…

CTF盲水印工具:Blind-WaterMark安装

工具下载地址&#xff1a;GitCode - 开发者的代码家园 下载完毕后&#xff0c;只留这些东西就行 接下来需要安装两个依赖&#xff1a; opencv、matplotlib 直接pip install安装的话&#xff0c;工具使用会报错 所以需要到网站里挑选适合的版本进行安装 下载地址&#xff1…