【算法系列-二叉树】层序遍历
【算法系列-二叉树】层序遍历
文章目录
- 【算法系列-二叉树】层序遍历
- 1. 算法分析🛸
- 2. 相似题型🎯
- 2.1 二叉树的层序遍历II(LeetCode 107)
- 2.2 二叉树的右视图(LeetCode 199)
- 2.3 二叉树的层平均值(LeetCode 637)
- 2.4 N叉树的层序遍历(LeetCode 429)
- 2.5 在每个树行中找最大值(LeetCode 515)
- 2.6 填充每个节点的下一个右侧节点指针(LeetCode 116)
- 2.7 二叉树的最大深度(LeetCode 104)
- 2.8 二叉树的最小深度(LeetCode 111)
1. 算法分析🛸
二叉树的层序遍历就是对树进行广度优先搜索,一层一层的对树的节点进行遍历;
【题目链接】102. 二叉树的层序遍历 - 力扣(LeetCode)
在这里,我们通过队列来辅助实现二叉树的层序遍历,关键在于寻找到判断当前节点正在哪一层且这一层的节点是否遍历完的条件。
解题过程🎬
定义一个size,这个size等于当前队列的长度大小;
开始先将根节点加入队列,形成第一层; 此时size = 1,再将队列中的节点弹出,将该节点的左右节点加入队列(非空),同时size - 1;
重复上述过程,直到size = 0时,表示当前层数的节点已经遍历完,进入下一层,直到队列为空,返回结果
代码示例🌰
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ret = new ArrayList<>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {List<Integer> list = new ArrayList<>();int size = queue.size();while (size > 0) {TreeNode cur = queue.poll();list.add(cur.val);if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}size--;}ret.add(list);}return ret;}
}
下面提供一些与层序遍历解法相似的类型题:
2. 相似题型🎯
2.1 二叉树的层序遍历II(LeetCode 107)
【题目链接】107. 二叉树的层序遍历 II - 力扣(LeetCode)
代码示例🌰
class Solution {public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> ret = new ArrayList<>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {List<Integer> list = new ArrayList<>();int size = queue.size();while (size > 0) {TreeNode cur = queue.poll();list.add(cur.val);if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}size--;}ret.add(0, list);}return ret;}
}
2.2 二叉树的右视图(LeetCode 199)
【题目链接】199. 二叉树的右视图 - 力扣(LeetCode)
解题思路与使用队列的层序遍历相同,需要注意的是要找到能够在右视图看到的节点,这个节点可以是左节点也可以是右节点,但它一定是每一层遍历的最右边节点,对此在遍历到队列中size为0的前一个节点时,将这个节点的值加入返回数组即可
代码示例🌰
class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> ret = new ArrayList<>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();while (size > 1) {queueOfferNode(queue);size--;}TreeNode node = queueOfferNode(queue);ret.add(node.val);}return ret;}TreeNode queueOfferNode(Queue<TreeNode> queue) {TreeNode cur = queue.poll();if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}return cur;}
}
2.3 二叉树的层平均值(LeetCode 637)
【题目链接】637. 二叉树的层平均值 - 力扣(LeetCode)
代码示例🌰
class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Double> ret = new ArrayList<>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();int num = size;double sum = 0;while (size > 0) {TreeNode cur = queue.poll();sum += cur.val;if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}size--;}ret.add(sum / num);}return ret;}
}
2.4 N叉树的层序遍历(LeetCode 429)
【题目链接】429. N 叉树的层序遍历 - 力扣(LeetCode)
代码示例🌰
/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> ret = new ArrayList<>();if (root == null) {return ret;}Queue<Node> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {List<Integer> list = new ArrayList<>();int size = queue.size();while (size > 0) {Node cur = queue.poll();list.add(cur.val);List<Node> children = cur.children;for (Node node : children) {if (node != null) {queue.offer(node);}}size--;}ret.add(list);}return ret;}
}
2.5 在每个树行中找最大值(LeetCode 515)
【题目链接】515. 在每个树行中找最大值 - 力扣(LeetCode)
代码示例🌰
class Solution {public List<Integer> largestValues(TreeNode root) {List<Integer> ret = new ArrayList<>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();int max = Integer.MIN_VALUE;while (size > 0) {TreeNode cur = queue.poll();if (cur.val > max) {max = cur.val;}if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}size--;}ret.add(max);}return ret;}
}
2.6 填充每个节点的下一个右侧节点指针(LeetCode 116)
【题目链接】116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)
代码示例🌰
/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, Node _left, Node _right, Node _next) {val = _val;left = _left;right = _right;next = _next;}
};
*/class Solution {public Node connect(Node root) {if (root == null) {return root;}Queue<Node> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();while (size-- > 0) {Node cur1 = queue.poll();Node cur2 = size == 0 ? null : queue.peek();cur1.next = cur2;if (cur1.left != null) {queue.offer(cur1.left);}if (cur1.right != null) {queue.offer(cur1.right);}}}return root;}
}
2.7 二叉树的最大深度(LeetCode 104)
【题目链接】104. 二叉树的最大深度 - 力扣(LeetCode)
代码示例🌰
class Solution {public int maxDepth(TreeNode root) {int ret = 0;if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {ret++;int size = queue.size();while (size > 0) {TreeNode cur = queue.poll();if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}size--;}}return ret;}
}
2.8 二叉树的最小深度(LeetCode 111)
【题目链接】111. 二叉树的最小深度 - 力扣(LeetCode)
代码示例🌰
class Solution {public int minDepth(TreeNode root) {int ret = 0;if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {ret++;int size = queue.size();while (size > 0) {TreeNode cur = queue.poll();if (cur.left == null && cur.right == null) {return ret;}if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}size--;}}return ret;}
}
以上便是对二叉树层序遍历问题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨
相关文章:
【算法系列-二叉树】层序遍历
【算法系列-二叉树】层序遍历 文章目录 【算法系列-二叉树】层序遍历1. 算法分析🛸2. 相似题型🎯2.1 二叉树的层序遍历II(LeetCode 107)2.2 二叉树的右视图(LeetCode 199)2.3 二叉树的层平均值(LeetCode 637)2.4 N叉树的层序遍历(LeetCode 429)2.5 在每个…...
我的世界方块改进版
引子 之前文章的磁性方块,通过3D打印实现,也批量打印了一些,下图就是一个小树 使用过程中,发现磁力感觉不紧,所以想改进一版。 正文 之前的结构如下:: 如果出现相邻的空隙间的磁铁相互作用&am…...
博客搭建之路:hexo增加搜索功能
文章目录 hexo增加搜索功能本地搜索弊端algolia搜索 hexo增加搜索功能 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 作为一个博客,没有搜索功能,如何在大批文章中找到自己想要的,那在hexo中如何增加搜索功能呢? search:path: sea…...
2024年最新互联网大厂精选 Java 面试真题集锦(JVM、多线程、MQ、MyBatis、MySQL、Redis、微服务、分布式、ES、设计模式)
前言 春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸…...
MybatisPlus入门(一)MybatisPlus简介
一、MyBatis简介 MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率 - 官网:https://mybatis.plus/ https://mp.baomidou.com/ MyBatisPlus特性: - 无侵入:只做增强…...
QoS学习笔记
QoS业务分类 基于 DiffServ 服务模型的 QoS 业务可以分为以下几大类: 流分类和标记(Traffic classification and marking):要实现差分服务,需要首先将数据包分为不同的类别或者设置为不同的优先级。将数据包分为不同…...
图(邻接矩阵)知识大杂烩!!(邻接矩阵结构,深搜,广搜,prim算法,kruskal算法,Dijkstra算法,拓扑排序)(学会一文让你彻底搞懂!!)
小伙伴们大家好,今天给大家带来图(邻接矩阵)的各种知识,让你看完此文章彻底学会邻接矩阵的相关问题。 1.邻接矩阵表示方法 1.1知识讲解 我们用一个二维数组arr来表示图。若图为有向图,其中arr【i】【j】w表示i号点和…...
Prometheus自定义PostgreSQL监控指标
本文我们将介绍如何在Prometheus中创建自定义PostgreSQL指标。默认情况下由postgres_export运行的查询可能不能满足用户需求,但我们可以创建自定义查询,并要求postgres_exporter公开自定义查询的结果。postgres_exporter最近被移到了Prometheus Communit…...
400行程序写一个实时操作系统(十六):操作系统中的调度策略
前言 在前面我们完成了Sparrow的临界区的代码,使用临界区,能够解决常见的并发问题,现在该完善我们的调度算法了。 调度算法在操作系统领域常常是热门的话题。不同的用途将会使用不同的调度策略。在本节,笔者将为大家介绍一些操作…...
从安灯系统看汽车零部件工厂的智能制造转型
在当今快速发展的制造业领域,汽车零部件工厂正面临着日益激烈的市场竞争和不断提高的客户需求。为了在竞争中脱颖而出,实现可持续发展,许多汽车零部件工厂纷纷踏上智能制造转型之路。而安灯系统作为一种重要的生产管理工具,在这场…...
SwiftUI(三)- 渐变、实心形状和视图背景
引言 在现代的应用的UI设计中,渐变和形状背景为界面带来了丰富的层次与视觉效果,而SwiftUI提供了一系列简单且强大的API,可以轻松实现这些效果。在这篇文章中,我们将介绍SwiftUI中的渐变、实心形状和视图背景的基础用法ÿ…...
RK3568-ota升级
ota升级 OTA(Over-the-Air)即空间下载技术。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主要通过网络,例如 WIFI、3G/4G 自动下载 OTA 升级包、自动升级,也支持通过…...
GR-ConvNet代码详解
GR-ConvNet代码详解 文章目录 GR-ConvNet代码详解前言一、utils1.dataset_processing1.image.py1.Iamge类2.DepthImage类3.WidthImage类 2.grasp.py1. _gr_text_to_no()方法2.GraspRectangles类3.GraspRectangle类3.Grasp类4.detect_grasps方法 3.generate_cornell_depth.py4.e…...
Excel自带傅里叶分析数据处理——归一化处理
在Excel工具中,默认情况下数据处理---傅里叶分析通常不进行归一化处理,需要用户手动进行归一化处理。 (1)傅里叶变换的原理 傅里叶变换将时域信号转换为频域信号,输出的是复数形式的频率分量,包含了幅值和…...
Centos7.6版本安装mysql详细步骤
操作步骤: 1.下载Linux版本Mysql并上传至linux系统中 2.解压mysql并查询系统中是否有相关软件存在以及配置mysql,启动mysql tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz rpm -qa|grep mysql ##查…...
寄宿学校:为自闭症儿童提供全面的教育和关爱
在这个多彩的世界里,每一个生命都值得被温柔以待,每一颗心灵都值得被悉心呵护。然而,自闭症儿童这一特殊群体,他们的世界却常常被误解和忽视。幸运的是,有一种教育模式——寄宿学校,正为这些孩子打开了一扇…...
LLaMA Factory环境配置
LLaMA-Factory官方文档 安装正确的torch和cuda版本 参考: PyTorch 报错解决 1.ImportError: /usr/lib/x86_64-linux-gnu/libstdc.so.6: version GLIBCXX_3.4.29 not found 参考这个解决:丝滑解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc.s…...
STM32实现毫秒级时间同步
提起“时间同步”这个概念,大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题,让多个传感器同时采集数据。 打个比方。两个人走路,都是100毫秒走一步(频率相同是前提&…...
瑞吉外卖之com.fasterxml.jackson.dataformat.cbor.CBORFactor相关报错
1.报错:Error creating bean with name routerFunctionMapping defined in class path resource [com/itheima/reggie/config/WebMvcConfig.class]: Failed to instantiate [org.springframework.web.servlet.function.support.RouterFunctionMapping]: Factory met…...
CSS - grid制作表格
1. grid-template-columns:网格布局中的列的数量,也可以设置列的宽度 .grid-container {display: grid;grid-template-columns: 80px 200px auto 40px; }.grid-container {display: grid;grid-template-columns: auto auto auto auto;//表示所有列的宽度…...
【pip】 的换源(临时换源和永久换源)
【pip】 的换源(临时换源和永久换源) 一、临时换源二、永久换源三、Linux换源四、Windows换源 一、临时换源 临时换源只需要在pip安装包时,加上一个-i参数后接源的url即可: 临时换源: 清华源 pip3 install markdown…...
Kaggle 数据集dogs-vs-cats的错误
如果你想用kaggle数据集dogs-vs-cats做深度学习数据,可能会遇到数据bug,大概类似于下面的错误: UnidentifiedImageError: cannot identify image file 其原因不是你的程序有问题,而是数据集本身还有bug: cats/666.jpgdogs/11702.jpg 预览一下…...
【网络原理】网络地址转换----NAT技术详解
💐个人主页:初晴~ 📚相关专栏:计算机网络那些事 我们在 IP协议 一文中介绍过,由于IPv4协议中 IP地址只有32位,导致最多只能表示 42亿9千万个IP地址。但我们需要通过IP地址来标识网络上的每一个设备&#x…...
React怎么创建虚拟dom和挂载到页面
1、🍟你可以直接下载本节配套的资源代码,然后导入vscode看效果,也可以跟着教程一点一点敲,都是没问题的。 2、🤔怎么运行本节代码? 很简单,随便找个浏览器打开index.html即可。💕 代…...
kafka-console-ui的简介及安装使用
kafka-console-ui的简介及安装使用 一、kafka-console-ui的简介二、安装kafka-console-ui2.1 源码安装2.2 docker安装 三、kafka-console-ui功能使用3.1、功能特性3.2、 功能介绍3.2.1 集群3.2.2 topic3.2.3 消费组3.2.4 Acl3.2.5 运维 一、kafka-console-ui的简介 kafka-cons…...
git 的分支管理详解
Git 的分支管理是其强大功能之一,允许开发者在同一代码库中并行开发多个特性或修复 bug,而不干扰主分支的代码。下面是对 Git 分支管理的详解: 1. 查看分支 查看所有分支 git branch # 查看本地分支 git branch -r # 查看远程分支 git br…...
w003基于Springboot的图书个性化推荐系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
医院信息化与智能化系统(6)
医院信息化与智能化系统(6) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应的…...
前端学习---(6)js基础--4
Promise Promise 是异步编程的一种新的解决方案和规范。 Promise优点: 1、可以很好地解决ES5中的回调地狱的问题(避免了层层嵌套的回调函数)。 2、统一规范、语法简洁、可读性和和可维护性强。 3、Promise 对象提供了简洁的 API,使得管理异步…...
241026-RHEL如何以root身份卸载Docker
在 RHEL 8.8 中,以 root 身份卸载 Docker 可以通过以下步骤完成: 停止 Docker 服务(如果已启动): sudo systemctl stop docker删除 Docker 包: 运行以下命令卸载 Docker 引擎及其依赖包(docker-…...
大型集团网站建设/建网站seo
先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义; Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或…...
室内装饰设计师证书/seo专员岗位要求
UITextField属性 0. enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的。 1.borderStyle 设置边框样式,只有设置了才会显示边框样式 text.borderStyle UITextBorderStyleRounded…...
济南网站建设tailook/百度搜一搜
我们要开发一个简单的B2C商城,能够完成商品显示,购物车功能,订单流程就可以了,数据库我们使用SQLServer2005。数据库中有商品表,订单表,订单明细表,会员表就可以了, 数据库模型如下&…...
怎么开发销售网站/中国网络营销公司
a 100def test(num): num num print(num)test(a)print(a) 200100 这里 num num 与 num num num 不能等价 num num 这里有两层意思 1。 看num指向的值是否能够修改 如果能修改 就直接修改(列表和字典类型可以修改) 2 如果不能修改 这里num想当于…...
wordpress实现伪静态/上海短视频推广
前几天有网友问在输入坐标或长度的时候是否能输入公式,比如20/3或7*8这样简单的算式。cad虽然在定位点或长度时不能直接输入算式,但利用计算器功能不仅可以输入数字的算式,还可以输入点之前的算式,点可以是直接拾取的点࿰…...
h5响应式网站做动画/千度搜索引擎
RequestMapping("queryUser5")public String queryUser5(String Userid,ModelMap modelMap) {// return "redirect:queryUser.action"; //重定向,方法参数不带过去, //可以用modelMap将参数传递过去modelMap.addAttribute("Userid&q…...