二叉树的锯齿形层序遍历

news2024/11/25 0:58:31

1.题目

这道题是2024-2-16的签到题,题目难度为中等。

考察知识点为BFS算法和双端队列。

题目链接:二叉树的锯齿形层序遍历

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

2.思路

        这道题其实归根结底还是二叉树的层序遍历,只不过在遍历的过程中有一个锯齿形的遍历顺序,其实这题我们可以在BFS遍历的基础上模拟遍历,我们肯定玩过冰火人大冒险这个游戏,其中第一关就是类似这种锯齿形的遍历。

        正常的层序遍历是每次遍历当前的结点队列,并将它们的子结点添加到下一次的结点队列中,因此这里我们仍然可以借助这种思想,只不过我们加一个判断,判断它是奇数层还是偶数层(假设根节点是奇数层),我的思路如下:

        如果当前层是奇数层,我依旧是正常遍历(从左往右),然后我需要先判断它的左子结点,然后再判断右子结点,如果有不为空的,我需要借助deque(双端队列)将它插入到队列左端。这里是为了保证偶数层最右边的结点在队列左侧,最左边的结点在队列右侧

        如果当前层是偶数层,我还是正常遍历,因此前面在奇数层的时候对这一层的节点队列进行了处理,保证我的结点时从右边开始,只不过这次我的判断顺序发生变化,我需要先判断它的右子结点,然后再判断左子结点,如果有不为空的,我需要借助deque(双端队列)将它插入到队列左端。这里是为了保证奇数层最左边的结点在队列左侧,最右边的结点在队列右侧,即顺序归位

3.代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        # 如果root结点为空
        if not root:
            return []
        # 结果列表
        rst = []
        # 双端队列
        q = deque([root])
        # 层数,这里只是简单的判断:奇数层、偶数层
        k = 1
        # 如果队列不为空
        while len(q) > 0:
            # 当前层的结点结果值
            r = []
            # 下一岑的双端队列
            tmp = deque()
            # 如果是奇数层
            if k == 1:
                # 遍历结点
                for node in q:
                    # 添加当前结点的值
                    r.append(node.val)
                    # 先判断左子结点
                    if node.left:
                        # 插入到队列左侧
                        tmp.appendleft(node.left)
                    # 再判断右子结点
                    if node.right:
                        # 插入到队列左侧
                        tmp.appendleft(node.right)
            # 如果为偶数层
            else:
                # 遍历结点
                for node in q:
                    # 添加当前结点的值
                    r.append(node.val)
                    # 先判断右子结点
                    if node.right:
                        # 插入到队列左侧
                        tmp.appendleft(node.right)
                    # 再判断左子结点
                    if node.left:
                        # 插入到队列左侧
                        tmp.appendleft(node.left)
            # 添加到结果列表
            rst.append(r)
            # 反转层数奇偶性
            k ^= 1
            # 更新队列
            q = tmp
        return rst

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VScode写LaTeX配置,实测有效

环境配置请看LaTeX环境配置-TexLive,实测有效http://t.csdnimg.cn/0txlL VScode写LaTeX配置 0.smatra pdf下载 如果使用外部pdf查看器,比如我用的sumatra pdf,官网是Sumatra PDF reader download page 下载对应版本,比如64位,下…

【STM32 CubeMX】I2C中断方式与DMA方式

文章目录 前言一、I2C中断方式1.1 CubeMX配置I2C中断1.2 I2C中断函数使用Master模式Mem模式 1.3 DMA方式发送和接收CubeMX配置IIC DMA方式Master模式Mem模式 总结 前言 在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可…

机器人专题:我国机器人产业园区发展现状、问题、经验及建议

今天分享的是机器人系列深度研究报告:《机器人专题:我国机器人产业园区发展现状、问题、经验及建议》。 (报告出品方:赛迪研究院) 报告共计:26页 机器人作为推动工业化发展和数字中国建设的重要工具&…

【数据结构】无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

无向图创建邻接矩阵、深度优先遍历和广度优先遍历 一、概念解析: (1)无向图:(2)邻接矩阵: 二、创建邻接矩阵:三、深度遍历、广度遍历 (1)深度遍历概念&#x…

模型 IPO(输入、处理、输出)学习模型

系列文章 分享 模型,了解更多👉 模型_总纲目录。重在提升认知。信息转化与传递。 1 模型 IPO(输入、处理、输出)学习模型的应用 1.1 项目管理知识体系 PMBOK 中的IPO应用 在项目管理领域,PMBOK(Project Management Body of Know…

ChatGPT绘图指南:DALL.E3玩法大全(一)

一、 DALLE.3 模型介绍 1、什么是 DALLE.3 模型? DALLE-3模型,是一种由OpenAI研发的技术,它是一种先进的生成模型,可以将文字描述转化为清晰的图片。这种模型的名称"DALLE"实际上是"Deep Auto-regressive Latent …

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘,实现服务器存储资源的统一整合、管理及调度,最终向上层提供NFS、ISCSI存储接口,供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

AcWing 1235. 付账问题(贪心)

[题目概述] 几个人一起出去吃饭是常有的事。 但在结帐的时候,常常会出现一些争执。 现在有 n 个人出去吃饭,他们总共消费了 S 元。 其中第 i 个人带了 a i a_i ai​ 元。 幸运的是,所有人带的钱的总数是足够付账的,但现在问题来…

计算机网络——13P2P应用

P2P应用 纯P2P架构 没有(或极少)一直运行额服务器任意端系统都可以直接通信利用peer的服务能力Peer节点间歇上网,每次IP地址都有可能变化 例子: 文件分发流媒体VoIP 文件分发:C/S vs P2P 问题:从一台…

《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)

文章目录 2.1 条件语句:决策的艺术2.1.1 基础知识讲解2.1.2 重点案例:用户角色权限判断实现用户角色权限判断扩展功能实现代码功能扩展:添加或删除用户 2.1.3 拓展案例 1:成绩等级判断实现成绩等级判断功能实现代码扩展功能&#…

Spring中的事务实现、失效场景即AOP的相关概念理解

spring实现事务(声明式事务)的本质就是aop完成的,它会对方法的前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或回滚事务。aop就是面向切面编程,在spring中将那些与业务无关,但却对多个对象产生影响的…

Opencv简单图像操作

Opencv 一、读取图片 1.imshow Mat imread(const string& filename, intflags1 );flags: enum { /* 8bit, color or not */CV_LOAD_IMAGE_UNCHANGED -1, /* 8bit, gray */CV_LOAD_IMAGE_GRAYSCALE 0, /* ?, color */CV_LOAD_IMAGE_COLOR 1, /* any depth, ? */…

深度学习之线性模型

深度学习之线性模型 y w * x模型思路 y w * x b模型思路 y w * x模型 思路 这里求权重w , 求最适合的权重,就是求损失值最小的时候 这里用穷举法:在一个范围内,列出w的所有值,并且计算出每组数据的平均损失值,以w 为横坐标, 损失值为纵坐…

定时器按秒计时

一、函数学习 二、代码、 main.c #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Timer.h"uint16_t Num;int main(void) {OLED_Init();Timer_Init(); OLED_ShowString(1,1,"Num:…

树莓派5 EEPROM引导加载程序恢复镜像

树莓派5不能正常启动,可以通过电源led灯的闪码来判断错误发生的大致情形。 LED警告闪码 如果树莓派由于某种原因无法启动,或者不得不关闭,在许多情况下,LED会闪烁特定的次数来指示发生了什么。LED会闪烁几次长闪烁,然…

Linux POSIX信号量 线程池

Linux POSIX信号量 线程池 一. 什么是POSIX信号量?二. POSIX信号量实现原理三. POSIX信号量接口函数四. 基于环形队列的生产消费模型五. 线程池 一. 什么是POSIX信号量? POSIX信号量是一种用于同步和互斥操作的机制,属于POSIX(Po…

C++入门篇——命名空间

在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键…

Calendar的使用(Java)

直接从需求来理解:将2024年2月16日增加一个月 如果不使用Calendar的话,我们需要定义字符串记住这个日期,然后把字符串解析成Date日期对象,通过Date日期对象获取其毫秒值,然后增加一个月的毫秒值,再格式化时…

社区养老|社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)

社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 (1) 用户管理 (2)服务种类管理 (3)社区服务管理 &#xff08…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之字符设备驱动(物联技术666)

链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码:1688 教学内容: 1、内核模块的简单框架: __init __exit执行完后就释放空间 简单框架:包含三个部分 1)模块初始化和模块退出函数…