热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Leetcode102二叉树的层序遍历详解

Leetcode102-二叉树的层序遍历详

   往期博客:

Leetcode1-两数之和详解

Leetcode2-两数相加代码详解

Leetcode20-有效的括号详解

Leetcode21-合并两个有序链表详解

Leetcode22-有效括号生成详解

Leetcode24-两两交换链表中的节点详解

Leetcode27-移除元素详解

Leetcode46-全排列详解

Leetcode49-字母异位分组详解

Leetcode53-最大子数组和详解

Leetcode56-合并区间详解

LeetCode57-插入区间详解

Leetcode77-组合详解

Leetcode78-子集详解

Leetcode90-子集II详解

Leetcode94-二叉树的中序遍历详解


目录

题目

示例

解析

广度优先搜索

深度优先搜索

代码

广度优先搜索

深度优先搜索


题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

题目分析

已知:二叉树根节点

目的:层序遍历

要求:从左到右访问二叉树


示例

示例1

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

示例2

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

示例3

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


解析

广度优先搜索

对于示例1,二叉树总共有3层,层序遍历需要先遍历第一层得到子集[3],再遍历第二层得到子集[9,20],最后遍历最后一层得到子集[15,7]。对于Leetcode94-二叉树的中序遍历这一题中遍历的大致方向是从上到下遍历,但是输出是从下到上输出,因为要从上到下找到最左左节点,然后从上到下从最左左节点一次输出,这满足栈的先进后出的特点,所以用栈方法来做题。而本题是逐层遍历,即从上到下遍历,并从上到下输出,这就满足了队列先进先出的思想,所以本题可以使用队列来做题。

 首先初始化三个变量,其中res存放每一层遍历的子集,size为每一层节点个数,queue为队列

 遍历第一层时,size=1,将节点3加入队列中,此时size=1,则只从队列中取出一个元素,即元素3,放到结果集中

此时,将节点3的左右孩子加入队列中,size=2 ,在出队的时候,先出9,当出9后查看节点9有没有左右孩子,有的话紧接着入队,没有的话出20,因为size=2,所以只出2个元素。

最后入队15和7,再逐一出队

 深度优先搜索

深度优先搜索是从上到下遍历二叉树的,所以这跟题目要求逐层遍历是相斥的,但是既然深度优先搜索是从上到下遍历那么可以根据层将元素归类,此时要确定每个元素属于那一层,并将该元素放入对应层的子集中。

例如对于如下二叉树,总共包含3层 ,那么他的结果集中一定包含3个子集,每个子集包含每层的元素

首先遍历第一层即root节点1,节点1属于0层节点,所以将3放入子集0中,然后遍历到节点2,及节点2属于1层,则将2放入子集1中,然后遍历到节点4,节点4属于2层,则将4放入子集2,依次进行直到所有节点遍历完 


代码

广度优先搜索

class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: result = [] if root is None: return result q = deque([]) # 创建队列 q.append(root) # 将根节点加入队列中 while len(q) > 0: size = len(q) ls = [] # 用于存放每一层遍历到的节点 while size > 0: cur = q.popleft() ls.append(cur.val) if cur.left is not None: q.append(cur.left) if cur.right is not None: q.append(cur.right) size = size-1 result.append(ls[:]) return result

深度优先搜索

class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: result = [] if root is None: return result self.dfs(root, result, 0) return result def dfs(self, node, result, level): if node is None: return if level > len(result)-1: result.append([]) # 向结果集中谈价空子集,用来存放当前层的元素 result[level].append(node.val) if node.left is not None: self.dfs(node.left, result, level+1) if node.right is not None: self.dfs(node.right, result, level+1)

推荐阅读
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
author-avatar
mobiledu2502892717
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有