【算法系列-二叉树】层序遍历
【算法系列-二叉树】层序遍历
文章目录
- 【算法系列-二叉树】层序遍历
- 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;//表示所有列的宽度…...
SAP选择屏幕下拉框实战:从VRM_SET_VALUES函数到完整配置流程
SAP选择屏幕下拉框实战:从VRM_SET_VALUES函数到完整配置流程 下拉框是SAP选择屏幕中最常用的交互元素之一,它能有效提升用户操作体验并减少输入错误。本文将深入解析如何利用VRM_SET_VALUES函数实现专业级下拉框功能,涵盖从基础配置到高级应用…...
ADaFuSE Adaptive Diffusion-generated Image and Text Fusion for Interactive Text-to-Image Retrieval
ADaFuSE: Adaptive Diffusion-generated Image and Text Fusion for Interactive Text-to-Image Retrieval Authors: Zhuocheng Zhang, Xingwu Zhang, Kangheng Liang, Guanxuan Li, Richard Mccreadie, Zijun Long Deep-Dive Summary: ADaFuSE: 用于交互式文本到图像检索的…...
智能体记忆:结构化索引优化上下文效率
在之前的文章中,我探讨了在与AI智能体协作时,角色设定为何仍然重要。不同的视角能以原始上下文无法复制的方式影响输出。但我也提出了一个需要正面解决的局限:每一个全新的上下文窗口都是从零开始的。角色设定每次都需要从头重建对你代码库的…...
Halcon中值滤波,均值滤波,高斯滤波
均值滤波(一般用来消除高斯噪声创建一个高斯核参数1为σ 值越大高斯噪声越多gauss_distribution( 9 ,Distribution)添加到图片上add_noise_distribution( Image , ImageNoise , Distribution)参数3 4 是滤波核, 建议使用奇数矩阵核,值越小越清…...
从零开始:在VMware虚拟机上部署FreeNAS的完整指南
1. 为什么选择在VMware上部署FreeNAS? 如果你正在寻找一个经济实惠又灵活的NAS解决方案,在VMware虚拟机上跑FreeNAS绝对是个明智的选择。我最早接触这个方案是在帮朋友搭建家庭媒体中心时,当时用实体机装FreeNAS总觉得太浪费硬件资源…...
探索含 SVG 的双馈风电场:基于 SVG 附加阻尼的次同步谐振抑制
含svg的双馈风电场 基于svg附加阻尼的次同步谐振抑制在当今的能源格局中,风力发电作为一种清洁且可持续的能源形式,正逐渐占据越来越重要的地位。其中,双馈风电场因其独特的优势被广泛应用。然而,次同步谐振(SSR&#…...
BeepBox:释放音乐创造力的零门槛工具 - 零基础创作者指南
BeepBox:释放音乐创造力的零门槛工具 - 零基础创作者指南 【免费下载链接】beepbox An online tool for sketching and sharing instrumental melodies. 项目地址: https://gitcode.com/gh_mirrors/be/beepbox 如何用BeepBox实现音乐创作自由? 当…...
RMBG-2.0实战教程:结合FFmpeg实现‘原图→去背→合成视频’流水线
RMBG-2.0实战教程:结合FFmpeg实现‘原图→去背→合成视频’流水线 1. 引言:从单张抠图到批量视频合成 如果你用过RMBG-2.0,一定会被它精准的抠图效果惊艳到。它能轻松地把照片里的人或物“抠”出来,背景变得干干净净。但你想过没…...
SEO_新手必看的SEO优化入门教程与核心方法(381 )
SEO优化入门:新手必看的核心方法 在互联网时代,网站的流量和曝光度直接关系到一个企业的成功与否。而搜索引擎优化(SEO)作为提高网站排名的关键技术之一,成为了每个网站运营者必须掌握的技能。本文将为新手提供一份详细…...
vSphere集群运维实录:我是如何用DRS规则搞定‘主备分离’和‘亲密无间’的
vSphere集群运维实战:DRS规则在复杂业务架构中的高阶应用 去年夏天,我们团队接手了一个金融系统的虚拟化迁移项目。这套系统包含12台域控制器、8组MySQL主从集群和超过30个Web应用节点,全部运行在由24台ESXi主机组成的vSphere集群上。当第一次…...
