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

难度等级:中等

上一篇算法:

104. 二叉树的最大深度【75】

力扣此题地址:

103. 二叉树的锯齿形层序遍历 - 力扣(Leetcode)

1.题目:103. 二叉树的锯齿形层序遍历

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

2.解题思路:

本题的解决思路和102. 二叉树的层序遍历【206】 类似,可以说思路基本一样,只是在一个细节的地方不一样。遍历完一层后,添加元素到链表中,可以选择添加到链表尾部还是头部,偶数层的话(即0、2、4)就添加到尾部,这样就是从左到右遍历;奇数层的话(即1、3、5)就添加到头部,这样就相当于从右往左遍历。

实现锯齿形层序遍历的方法,本质上其实就是在添加元素的时候选择插入到链表尾部还是头部。

具体思路:

1.按层数的奇偶来决定每一层的输出顺序。规定二叉树的根节点为第0 层,如果当前层数是偶数,从左至右输出当前层的节点值,否则,从右至左输出当前层的节点值。

2.我们依然可以沿用第 102 题的思想,修改广度优先搜索,对树进行逐层遍历,用队列维护当前层的所有元素,当队列不为空的时候,求得当前队列的长度size,每次从队列中取出 size个元素进行拓展,然后进行下一次迭代。

3.为了满足题目要求的返回值为「先从左往右,再从右往左」交替输出的锯齿形,我们可以利用「双端队列」的数据结构来维护当前层节点值输出的顺序。

4.双端队列是一个可以在队列任意一端插入元素的队列。在广度优先搜索遍历当前层节点拓展下一层节点的时候我们仍然从左往右按顺序拓展,但是对当前层节点的存储我们维护一个boolean类型的变量 isOrderLeft,记录是从左至右还是从右至左的:

        *如果从左至右,我们每次将被遍历到的元素插入至双端队列的末尾。

        *如果从右至左,我们每次将被遍历到的元素插入至双端队列的头部。

当遍历结束的时候我们就得到了答案数组。

思路参考:103. 二叉树的锯齿形层序遍历 - 力扣(Leetcode)

3.代码实现:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        //先创建一个list列表作为返回值
        List<List<Integer>> ans = new LinkedList<List<Integer>>();
        
        if(root == null){
            return ans;
        }

        //创建一个队列,用于存放树的结点,结点的出队入队
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.add(root);
        boolean isOrderLeft = true;

        while(!queue.isEmpty()){
            //声明一个双端队列,用于接收结点,双端队列可以从尾部添加元素,也可以从头部添加元素
            //队列的实现有两种,数组和链表都可以实现队列
            Deque<Integer> list = new LinkedList<Integer>();
            int size = queue.size();
            
            for(int i=0;i<size;i++){
                //当前结点出队
                TreeNode curNode = queue.poll();
                //如果isOrderLeft为true,说明是偶数,则从左到右添加元素
                //如果isOrderLeft为false,说明是奇数,则从右到左添加元素
                if(isOrderLeft){
                    list.offerLast(curNode.val);
                }else{
                    list.offerFirst(curNode.val);
                }

                //每出一个节点,对应的将其左右子节点添加到队列中
                if(curNode.left != null){
                    queue.add(curNode.left);
                }
                if(curNode.right != null){
                    queue.add(curNode.right);
                }
            }
            //将这一层被遍历的结点值放入列表中
            ans.add(new LinkedList<Integer>(list));
            //对isOrderLeft赋值,下一次遍历则反过来遍历
            isOrderLeft = !isOrderLeft;
        }
        return ans;
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/14417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

24、LLVM编译流程

一、LLVM 1.1 LLVM概述 LLVM是构架编译器(compiler)的框架系统,以C编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本.LLVM计划启动于2000年,最初由美国…

家用洗地机要怎么选?平价洗地机推荐

国内大多数家庭比较注重地面清洁&#xff0c;不仅是要扫的干净&#xff0c;更要拖的干净&#xff0c;尤其追求地板锃亮的视觉效果&#xff0c;因此家用洗地机因其清洁效率高、能吸除干湿垃圾以及自清洁拖布等优点&#xff0c;成为很多家庭用于替代扫帚拖把等传统清洁工具的清洁…

被优化了怎么办?他苦学仨月拿到11koffer

网上有个段子叫做“生活就是起起落落落落落落”。人生在世&#xff0c;本就不易&#xff0c;再加上最近大环境影响&#xff0c;各行各业都在内卷&#xff0c;身为芸芸众生的一员&#xff0c;我们也难免受到影响&#xff0c;面临福利裁剪、降薪、甚至被优化的风险。 大环境我们…

云擎未来 万象共生:2023移动云万象生态峰会来袭

云融万象&#xff0c;赋能千行百业&#xff0c;云是万物智能的源泉&#xff0c;生态是移动云与万千伙伴共同发展的沃土。 2023移动云万象生态峰会将于4月25日下午在苏州金鸡湖国际会议中心隆重举行&#xff0c;大会荟聚众多重量级嘉宾&#xff0c;共话生态新发展&#xff0c;同…

Nacos简介 安装 配置

简介 什么是注册中心 注册中心在微服务项目中扮演着非常重要的角色&#xff0c;是微服务架构中的纽带&#xff0c;类似于通讯录&#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c;服务会注册到这里&#xff0c;当服务需要调用其它服务时&#xff0c;…

给你们讲个笑话——低代码会取代程序员

今天是正经男&#xff0c;我们严肃讨论一下一直以来争吵不休的取代问题。 低代码开发平台&#xff0c;低代码技术会取代开发人员么&#xff1f; 一、背景 低代码开发平台的普及&#xff0c;让很多公司对快速生成应用抱有很大期望。甚至有人认为&#xff0c;低代码开发平台未来…

关于Java注解的一些理解 小结

目录 1. 常用注解和理解 2. 自定义注解 2.1 案例背景 2.2 设计思路 3 总结 1. 常用注解和理解 注解在我的理解下&#xff0c;就是代码中的特殊标记&#xff0c;这些标记可以在编译、类加载、运行时被读取&#xff0c;并执行相对应的处理。 可能有些抽象&#xff0c;简单…

JavaWeb学习笔记

文章目录 一. HTML二. CSS三. JavaScript1. 引入2.语法/输出语句3. 变量/数据类型4. 运算符5. 流程控制语句6. 函数7. 对象8. 事件监听 四. Servlet1.执行流程2. 生命周期3. 常用方法4. 体系结构5. 配置Servlet 五. JSP1. 简介2. JSP原理3.脚本4.JSP缺点5. EL表达式6. JSTL标签…

Android kotlin 用RecyclerView(androidx+BRVAH3.0.6)实现从底部弹出列表对话框(单选/多选)功能

文章目录 一、实现效果二、引入依赖三、实现源码1、实体类2、适配器单选/多选3、框架弹窗AnyLayer单选/多选3、实现视图一、实现效果 二、引入依赖 在app的build.gradle在添加以下代码 1、框架弹窗AnyLayer(github官网):implementation "com.github.goweii:AnyLayer:4.1…

Go语言基础----Go语言简介

【原文链接】Go语言基础----Go语言简介 一、Go语言简介 Go语言&#xff0c;又称Golang&#xff0c;是Google公司的Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson开发的一种静态强类型、编译型的语言。Go语言语法和C语言接近&#xff0c;但是功能上内存安全&#xff…

一文弄懂Jupyter的配置与使用(呕心沥血版)

Jupyter 是一个基于 Web 的交互式计算平台&#xff0c;使用户能够创建和共享文档&#xff0c;这些文档包含实时代码、方程式、可视化图表和解释文字。Jupyter 在数据分析领域被广泛应用&#xff0c;它提供了一个直观、交互式的操作界面&#xff0c;使得用户能够更容易地探索数据…

【WinForm】Android手机群控工具-桌面程序开发实现

如何将手下多个Android手机统一管理起来呢&#xff0c;这里是用通过终端输入adb命令来实现控制多个手机的&#xff0c;具体怎么做&#xff0c;接下来给讲一讲。 使用adb工具包 首先&#xff0c;需要准备一套工具&#xff0c;以下是adb工具套件&#xff0c;是在Android SDK开发…

5天学会Linux C高级

day1 用C语言的理论知识点去推断结果 需求&#xff1a;让面试官知道你懂这个内容 一、C语言补充内容 【1】结构体补充内容&#xff1a; 1&#xff09;结构体.等法 结构体.等法代码 #include <stdio.h> struct student { int num; float score; char name[32…

Rust之泛型、特性和生命期(一):基本概念

开发环境 Windows 10Rust 1.69.0 VS Code 1.77.3 项目工程 这里继续沿用上次工程rust-demo 泛型、特性和生命期 每种编程语言都有有效处理概念重复的工具。在Rust中&#xff0c;一个这样的工具就是泛型&#xff1a;具体类型或其他属性的抽象替身。我们可以表达泛型的行为或…

【世界读书日】2023年通信好书推荐

今天是世界读书日&#xff08;4月23日&#xff09;。按照老规矩&#xff0c;小编给大家推荐一些通信类的优秀书籍。 过去一年&#xff0c;通信行业的关注热点&#xff0c;主要是&#xff1a;5G-Advanced&#xff08;5.5G&#xff09;、算力网络、东数西算、6G、卫星互联网、智…

如何正确高效地学习android开发?

每一个能成为行业大佬的人&#xff0c;一定有自己独特的方法… 之所以能成为大佬&#xff0c;是因为他们会有自己独特的见解&#xff0c;在一次次的尝试中不断否定&#xff0c;然后一次次的确定&#xff0c;一个程序员想要精益求精&#xff0c;必须要有高效的学习方法和良好的…

历史上的今天大事件查询工具推荐 - 历史上的今天 API

引言 历史上的今天&#xff0c;总会有一些特别的事件发生&#xff0c;这些事件对人类的发展产生了深远的影响。想要了解这些事件&#xff0c;往往需要花费大量的时间和精力去查阅历史资料。但现在&#xff0c;有了历史上的今天 API&#xff0c;一切变得方便了许多。 如果你对…

3年外包终上岸,我只能说这类公司能不去就不去····

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是3年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

SAP KANBAN 从入门到放弃系列之调拨模式

之前已经有三篇文章写了后台配置相关的介绍&#xff0c;这里不赘述。详见&#xff1a; PP-KANBAN-看板概述 SAP KANBAN 从入门到放弃系列之生产补货模式 SAP KANBAN 从入门到放弃系列之采购补货模式 第一步&#xff1a;补货策略-转库。不同的补充策略的控制类型有不同的作用…

6.3 收敛性与稳定性

6.3.1 收敛性 数值计算方法的收敛性是指&#xff0c;当取步长趋近于零时&#xff0c;数值解趋近于精确解的速度。一般来说&#xff0c;数值计算方法的收敛性是判断其优劣的重要指标之一。 数值计算方法的收敛性可以通过数学分析来研究&#xff0c;一般需要对数值解和精确解之…