二叉树的层序遍历(含十道leetcode相关题目)

文章目录

  • 二叉树层序遍历模板
  • 102. 二叉树的层序遍历

二叉树层序遍历模板

我们之前讲过了关于二叉树的深度优先遍历的文章:前中后序遍历的递归法和迭代法。

接下来我们再来介绍二叉树的另一种遍历方式:层序遍历

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

在这里插入图片描述
如图所示:将每层的元素从左至右加入队列,取出时就会先取出左节点,并将当前节点的左右节点又加入队尾,接着从队列取出下一个元素,将它的左右节点同样加入队尾,以此类推。那怎么确认取出多少个元素的时候可认为当前层的元素都取完了呢?这就需要一个变量来记录啦,这个变量其实就是每轮循环开始时队列的长度,当前长度就是当前层的所有元素,该轮循环的后续操作就是将下一层的所有节点加入队尾。

这样就实现了层序从左到右遍历二叉树。

代码如下:这份代码也可以作为二叉树层序遍历的模板,打十个就靠它了。

Go代码如下

102. 二叉树的层序遍历

迭代法

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) != 0 {// 当前层的元素个数,以及定义存当前层结果的数组queueSize := len(queue)curLevelRes := make([]int,0)// 取出当前层所有元素,并依次加入下一层的元素for i := 0; i < queueSize ;i++ {curNode := queue[0]queue = queue[1:len(queue)]curLevelRes = append(curLevelRes,curNode.Val)// 当前节点的左右节点加入队列if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 当前层遍历完成,将当前层结果加入最终结果中res = append(res,curLevelRes)}return res
}

递归法

// 层序遍历递归法
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)preOrder(root,0,&res) //根节点在第0层return res
}/*直接使用二叉树的前序遍历的递归形式即可,只是递归的时候,要多传一个参数,就是该节点属于第几层的,很简单,子节点所在层数是父节点所在层数加一*/
func preOrder(node *TreeNode,level int,res *[][]int) {//如果level是新层,则在res中继续添加一个[]int用于存这一次的结点的值if len(*res) == level {culLevelRes := make([]int,0)*res = append(*res,culLevelRes)}//将结点的值添加到res中对应的层的[]int中(*res)[level] = append((*res)[level],node.Val)//递归遍历左右子节点if node.Left != nil {preOrder(node.Left,level + 1,res)}if node.Right != nil {preOrder(node.Right,level + 1,res)}
}

在这里插入图片描述

102. 二叉树的层序遍历

102. 二叉树的层序遍历

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

示例 1:
在这里插入图片描述

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

示例 2:

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

示例 3:

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

提示:

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

Go 代码迭代法

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) != 0 {// 当前层的元素个数,以及定义存当前层结果的数组queueSize := len(queue)curLevelRes := make([]int,0)// 取出当前层所有元素,并依次加入下一层的元素for i := 0; i < queueSize ;i++ {curNode := queue[0]queue = queue[1:len(queue)]curLevelRes = append(curLevelRes,curNode.Val)// 当前节点的左右节点加入队列if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 当前层遍历完成,将当前层结果加入最终结果中res = append(res,curLevelRes)}return res
}

在这里插入图片描述

Go代码递归法

// 层序遍历递归法
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)preOrder(root,0,&res) //根节点在第0层return res
}/*直接使用二叉树的前序遍历的递归形式即可,只是递归的时候,要多传一个参数,就是该节点属于第几层的,很简单,子节点所在层数是父节点所在层数加一*/
func preOrder(node *TreeNode,level int,res *[][]int) {//如果level是新层,则在res中继续添加一个[]int用于存这一次的结点的值if len(*res) == level {culLevelRes := make([]int,0)*res = append(*res,culLevelRes)}//将结点的值添加到res中对应的层的[]int中(*res)[level] = append((*res)[level],node.Val)//递归遍历左右子节点if node.Left != nil {preOrder(node.Left,level + 1,res)}if node.Right != nil {preOrder(node.Right,level + 1,res)}
}

在这里插入图片描述

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

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

相关文章

1.1 软件测试 + AI

欢迎大家订阅【软件测试】学习专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言一、软件测试二、人工智能的引入 前言 人工智能的引入为软件测试带来了巨大的变革&#xff0c;不仅提升了测试效率和准确性&#xff0c;也为软件质量的保障提供了新的手段。通…

微信小程序开发自带的自定义Navigation-bar避坑

最近新开了一个小程序项目&#xff0c;用了新版本的微信小程序开发工具。在模拟器上开发一直都很顺利&#xff0c;开发完成之后&#xff0c;要上到真机上进行测试&#xff0c;发现在华为的鸿蒙上&#xff0c;样式有点不对了。 居然NavigationBar被遮住了一半&#xff0c;发现在…

Spark-ShuffleWriter-UnsafeShuffleWriter-钨丝内存分配

一、上下文 《Spark-ShuffleWriter-UnsafeShuffleWriter》中提到在进行Page内存分配时&#xff0c;调用了一行代码 MemoryBlock page memoryManager.tungstenMemoryAllocator().allocate(acquired); 这里就会走MemoryManager的钨丝内存分配&#xff0c;下面我们来详细看下 …

MySQL高阶1831-每天的最大交易

题目 编写一个解决方案&#xff0c;报告每天交易金额 amount 最大 的交易 ID 。如果一天中有多个这样的交易&#xff0c;返回这些交易的 ID 。 返回结果根据 transaction_id 升序排列。 准备数据 Create table If Not Exists Transactions (transaction_id int, day date, …

python筛选出不合格密码的用户

有如下数据&#xff1a;筛选出不合格密码的用户&#xff0c;对出现至少四个连续数值为不合格密码&#xff0c;例如"1234"、"8765"为不合格密码 用户名密码X12345678Y87654321O10293847P39485726Q28475639R19283746S91827364T56473829U83746592V28374659W7…

新手教学系列——基于统一页面的管理后台设计(一)

在现代企业级应用中,后台管理系统往往是核心组成部分,特别是随着业务规模的扩展,如何在多个后端服务模块的基础上实现统一的登录验证、权限控制和页面管理,成为许多开发者面对的挑战。本文将以实际项目为例,详细讲解如何设计一个多模块的后台管理系统,满足不同服务模块的…

superset 解决在 mac 电脑上发送 slack 通知的问题

参考文档: https://superset.apache.org/docs/configuration/alerts-reports/ 核心配置: FROM apache/superset:3.1.0USER rootRUN apt-get update && \apt-get install --no-install-recommends -y firefox-esrENV GECKODRIVER_VERSION0.29.0 RUN wget -q https://g…

leetcode:字符串中的第一个唯一字符

#include <unordered_map> class Solution { public:int firstUniqChar(string s) {unordered_map<char, int> HashMap;string::iterator it s.begin();int i 0;//标记元素下标while (it ! s.end())//初始化哈希表{if (HashMap.count(*it) > 0)//原先hash表中…

saltstack远程执行

一、saltstack远程执行 一、saltstack远程执行&#xff1a;目标-targeting 详解见&#xff1a;https://www.cnblogs.com/phennry/p/5416408.html 1、查看认证主机情况 2、具体匹配 Globing :   *, 正则:      指定-E参数&#xff0c;正则表达式匹配多个 List&#xff1a…

我的AI工具箱Tauri版-FasterWhisper音频转文本

本教程基于自研的AI工具箱Tauri版进行FasterWhisper音频转文本服务。 进入软件后可以直接搜索 FasterWhisper 或者依次点击 Python音频技术/音频tools 进入该模块。 进入目录后需要进行一些基础配置&#xff0c;参数是默认的可以根据自己的机器进行一些简单的参数操作。 使用方…

新的 MathWorks 硬件支持包支持从 MATLAB 和 Simulink 模型到高通 Hexagon 神经处理单元架构的自动化代码生成

MathWorks 今天宣布&#xff0c;推出针对 Qualcomm Hexagon™ 神经处理单元&#xff08;NPU&#xff09;的硬件支持包。该处理单元嵌入在 Snapdragon 系列处理器中。MathWorks 硬件支持包&#xff0c;则专门针对 Qualcomm Technologies 的 Hexagon NPU 架构进行优化&#xff0c…

NISP 一级 | 7.2 信息安全风险管理

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;信息安全风险 信息系统不可能达到绝对安全&#xff0c;但可以通过安全风险&#xff08;以下简称“风险”&#xff09;控制来实现符合个人或单位目标的一定程度的安全。信息安全管…

Axure PR 9 标签 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将深入探讨Axure中可编辑标签元件设计与交互技巧。 可移除标签元件 创建可移除标签所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个文本框元件。 3.选中文本框元件&#xff0c…

Java安全(加密+HTTPS+WEB安全)

Java加密 单向加密 接收一段明文&#xff0c;然后以一种不可逆的方式将它转换成一段密文 ①、MD5&#xff0c;将无论多长的数据最后编码128位数据&#xff0c;常用文件校验、密码加密、散列数据 byte[] data ...;//明文数据 MessageDigest md5 MessageDigest.getInstance…

构建未来教育:智慧校园的功能与特色

智慧校园是一种利用先进科技手段将传统学校建设与管理进行智能化升级的教育发展模式。其主要功能和特点旨在提供更高效、便捷、安全的教育环境&#xff0c;致力于推动教育教学质量和校园管理水平向更智能化方向发展。 主要功能 1.智能安防系统: 监控摄像头、门禁系统等安防设…

【技术文章】ArcGIS Pro如何批量导出符号和工程样式?

目录 1.确定Pro软件版本 2.共享工程样式 3.管理和调用项目样式 制作好的地图&#xff0c;如何快速分享地图中的符号样式用于其它地图的制作&#xff1f; 在ArcMap软件中&#xff0c;可以通过命令一键批量导出所有符号。ArcGIS Pro软件是否也可以批量导出符号用于其它地图…

OceanBase 中 schema 的定义与应用

背景 经常在OceanBase 的问答社区 里看到一些关于 “schema 是什么” 的提问。 先纠正一些同学的误解&#xff0c; OceanBase 中的 Schema 并不简单的等同于 Database&#xff0c;本次分享将探讨 OceanBase 中的Schema是什么&#xff0c;及一些大家经常遇到的问题。 具体而…

从Profinet到Ethernet IP网关技术重塑工业网络,数据传输更流畅

Profinet转Ethernet IP网关在未来工业领域可能产生以下重要影响并发挥关键作用&#xff1a;促进工业设备集成与互操作性&#xff1a;打破协议壁垒&#xff1a;在工业场景中&#xff0c;存在多种不同的工业以太网协议&#xff0c;设备往往因协议差异而难以直接通信。 Profinet转…

C语言实现汉诺塔

这是一个古典的数学问题&#xff0c;是一个只有用递归方法解决的问题。问题是这样的&#xff1a;古代有一个梵塔&#xff0c;塔内有3个座A&#xff0c;B&#xff0c;C&#xff0c;开始时A座上有64个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上。有一…

MybatisPlus:多条件 or()的使用

default List<ErpProductDO> selectByOE(String oe1, String oe2){return selectList(new LambdaUpdateWrapper<ErpProductDO>().eq(ErpProductDO::getOe,oe1).or().eq(ErpProductDO::getOe,oe2)); } 对应SQL为&#xff1a;