【优选算法】(第三十六篇)

news2024/11/24 13:22:20

目录

⼆叉树的锯⻮形层序遍历(medium)

题目解析

讲解算法原理

编写代码

⼆叉树的最⼤宽度(medium)

题目解析

讲解算法原理

编写代码


⼆叉树的锯⻮形层序遍历(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼆叉树的根节点root,返回其节点值的锯⻮形层序遍历。(即先从左往右,再从右往左进⾏下⼀层遍历,以此类推,层与层之间交替进⾏)。
⽰例1:

输⼊:root=[3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]
⽰例2:
输⼊:root=[1]
输出:[[1]]
⽰例3:
输⼊:root=[]
输出:[]

讲解算法原理

解法(层序遍历):
算法思路:

在正常的层序遍历过程中,我们是可以把⼀层的结点放在⼀个数组中去的。
既然我们有这个数组,在合适的层数逆序就可以得到锯⻮形层序遍历的结果。

编写代码

c++算法代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 * int val;
 * TreeNode *left;
 * TreeNode *right;
 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), 
right(right) {}
 * };
 */
class Solution
{
public:
 vector<vector<int>> zigzagLevelOrder(TreeNode* root) 
 {
 vector<vector<int>> ret;
 if(root == nullptr) return ret;
 queue<TreeNode*> q;
 q.push(root);
 int level = 1;
 while(q.size())
 {
 int sz = q.size();
 vector<int> tmp;
 for(int i = 0; i < sz; i++)
 {
 auto t = q.front();
 q.pop();
 tmp.push_back(t->val);
 if(t->left) q.push(t->left);
 if(t->right) q.push(t->right);
 }
 // 判断是否逆序
 if(level % 2 == 0) reverse(tmp.begin(), tmp.end());
 ret.push_back(tmp);
 level++;
 }
 return ret;
 }
};

java算法代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode() {}
 * TreeNode(int val) { this.val = val; }
 * TreeNode(int val, TreeNode left, TreeNode right) {
 * this.val = val;
 * this.left = left;
 * this.right = right;
 * }
 * }
 */
class Solution
{
 public List<List<Integer>> zigzagLevelOrder(TreeNode root) 
 {
 List<List<Integer>> ret = new ArrayList<>();
 if(root == null) return ret;
 Queue<TreeNode> q = new LinkedList<>();
 q.add(root);
 int level = 1;
 
 while(!q.isEmpty())
 {
 int sz = q.size();
 List<Integer> tmp = new ArrayList<>();
 for(int i = 0; i < sz; i++)
 {
 TreeNode t = q.poll();
 tmp.add(t.val);
 if(t.left != null) q.add(t.left);
 if(t.right != null) q.add(t.right);
 }
 // 判断是否逆序
 if(level % 2 == 0) Collections.reverse(tmp);
 ret.add(tmp);
 level++;
 }
 return ret;
 }
}

⼆叉树的最⼤宽度(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀棵⼆叉树的根节点root,返回树的最⼤宽度。树的最⼤宽度是所有层中最⼤的宽度。
每⼀层的宽度被定义为该层最左和最右的⾮空节点(即,两个端点)之间的⻓度。将这个⼆叉树视作与满⼆叉树结构相同,两端点间会出现⼀些延伸到这⼀层的null节点,这些null节点也计⼊⻓度。
题⽬数据保证答案将会在32位带符号整数范围内。⽰例1:

输⼊:root=[1,3,2,5,3,null,9]输出:4
解释:
最⼤宽度出现在树的第3层,宽度为4(5,3,null,9)。⽰例2:

输⼊:root=[1,3,2,5,null,null,9,6,null,7]输出:7
解释:
最⼤宽度出现在树的第4层,宽度为7(6,null,null,null,null,null,7)。

讲解算法原理

解法(层序遍历):

算法思路:
1. 第⼀种思路(会超过内存限制):既然统计每⼀层的最⼤宽度,我们优先想到的就是利⽤层序遍历,把当前层的结点全部存在队列⾥
⾯,利⽤队列的⻓度来计算每⼀层的宽度,统计出最⼤的宽度。但是,由于空节点也是需要计算在内的。因此,我们可以选择将空节点也存在队列⾥⾯。
这个思路是我们正常会想到的思路,但是极端境况下,最左边⼀条⻓链,最右边⼀条⻓链,我们需要存⼏亿个空节点,会超过最⼤内存限制。
2. 第⼆种思路(利⽤⼆叉树的顺序存储-通过根节点的下标,计算左右孩⼦的下标):依旧是利⽤层序遍历,但是这⼀次队列⾥⾯不单单存结点信息,并且还存储当前结点如果在数组中存
储所对应的下标(在我们学习数据结构-堆的时候,计算左右孩⼦的⽅式)。
这样我们计算每⼀层宽度的时候,⽆需考虑空节点,只需将当层结点的左右结点的下标相减再加 1 即可。
但是,这⾥有个细节问题:如果⼆叉树的层数⾮常恐怖的话,我们任何⼀种数据类型都不能存下下标的值。但是没有问题,因为
• 我们数据的存储是⼀个环形的结构;
• 并且题⽬说明,数据的范围在 int 这个类型的最⼤值的范围之内,因此不会超出⼀圈;
• 因此,如果是求差值的话,我们⽆需考虑溢出的情况。

编写代码

c++算法代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 * int val;
 * TreeNode *left;
 * TreeNode *right;
 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), 
right(right) {}
 * };
 */
class Solution
{
public:
 int widthOfBinaryTree(TreeNode* root) 
 {
 vector<pair<TreeNode*, unsigned int>> q; // ⽤数组模拟队列
 q.push_back({root, 1});
 unsigned int ret = 0;
 while(q.size())
 {
 // 先更新这⼀层的宽度
 auto& [x1, y1] = q[0];
 auto& [x2, y2] = q.back();
 ret = max(ret, y2 - y1 + 1);
 // 让下⼀层进队
 vector<pair<TreeNode*, unsigned int>> tmp; // 让下⼀层进⼊这个队列 for(auto& [x, y] : q)
 {
 if(x->left) tmp.push_back({x->left, y * 2});
 if(x->right) tmp.push_back({x->right, y * 2 + 1});
 }
 q = tmp;
 }
 return ret;
 }
};

java算法代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode() {}
 * TreeNode(int val) { this.val = val; }
 * TreeNode(int val, TreeNode left, TreeNode right) {
 * this.val = val;
 * this.left = left;
 * this.right = right;
 * }
 * }
 */
class Solution
{
 public int widthOfBinaryTree(TreeNode root) 
 {
 List<Pair<TreeNode, Integer>> q = new ArrayList<>(); // ⽤数组模拟队列 q.add(new Pair<TreeNode, Integer>(root, 1));
 int ret = 0; // 记录最终结果
 while(!q.isEmpty())
 {
 // 先更新⼀下这⼀层的宽度
 Pair<TreeNode, Integer> t1 = q.get(0);
 Pair<TreeNode, Integer> t2 = q.get(q.size() - 1);
 ret = Math.max(ret, t2.getValue() - t1.getValue() + 1);
 // 让下⼀层进队
 List<Pair<TreeNode, Integer>> tmp = new ArrayList<>();
 for(Pair<TreeNode, Integer> t : q)
 {
 TreeNode node = t.getKey();
 int index = t.getValue();
 if(node.left != null)
 {
 tmp.add(new Pair<TreeNode, Integer>(node.left, index * 2));
 }
 if(node.right != null)
 {
 tmp.add(new Pair<TreeNode, Integer>(node.right, index * 2
+ 1));
 }
 }
 q = tmp;
 }
 return ret;
 }
}

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

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

相关文章

【高中生讲机器学习】21. 隐马尔可夫模型好难?看过来!(下篇)

创建时间&#xff1a;2024-10-09 首发时间&#xff1a;2024-10-12 最后编辑时间&#xff1a;2024-10-12 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名高一学生&#xff0c;热爱计…

SpringBoot购物推荐网站:设计与实现的最佳实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

『深度分析』Kimi版o1来了!Kimi探索版全面解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

28幅高清修复的英文版中国地图

我们在《183幅值得珍藏的全国地质图集》和《55幅值得珍藏的水文地质图集》两文中&#xff0c;为你分享过精美的全国地质图和水文地质图。 现在我们整理了28幅英文版中国地图&#xff0c;并经过高清修复后分享给大家&#xff0c;你可以在文末查看该数据的领取方法。 28幅英文版…

Channel模块 --- 管理套接字事件

目录 设计思想 实现 设计思想 Channel模块是用于对一个描述符所需要监控的事件以及事件触发之后要执行的回调函数进行管理的 具体来说&#xff0c;它里面会保存该文件描述符所监控的事件&#xff0c;该文件描述符所就绪的事件&#xff0c;以及该描述符的各种事件的处理回调…

4 机器学习之归纳偏好

通过学习得到的模型对应了假设空间中的一个假设。于是&#xff0c;图1.2的西瓜版本空间给我们带来一个麻烦&#xff1a;现在有三个与训练集一致的假设&#xff0c;但与它们对应的模型在面临新样本的时候&#xff0c;却会产生不同的输出。例如&#xff0c;对&#xff08;色泽青绿…

java算法oj(3)栈和队列

目录 1.前言 2.正文 2.1基础操作 2.2用栈实现队列 2.2.1题目 2.2.2示例 2.2.3代码 2.3用队列实现栈 2.3.1题目 2.3.2示例 2.3.3代码 2.4最小栈 2.4.1题目 2.4.2示例 2.4.3代码 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道栈与队列的算法题&#…

三、AOP

文章目录 1. AOP&#xff08;概念&#xff09;2. AOP&#xff08;底层原理&#xff09;2.1 AOP 底层使用动态代理2.2 AOP&#xff08;JDK动态代理&#xff09; 3. AOP&#xff08;术语&#xff09;3.1 连接点3.2 切入点3.3 通知&#xff08;增强&#xff09;3.4 切面 4. AOP操作…

数据丢失不再怕!四款数磁盘数据恢复据恢复工具实测心得

在办公室行政的工作中&#xff0c;数据恢复工具是我们不可或缺的帮手。无论是不小心删除了重要文件&#xff0c;还是硬盘突然罢工&#xff0c;这些工具总能在关键时刻帮我们力挽狂澜。今天&#xff0c;我就来分享一下我使用福昕数据恢复、转转大师数据恢复、超级兔子数据恢复和…

MySQL 【数字】函数大全(二)

MODPIPOWPOWERRANDROUNDSIGNSQRTTRUNCATE 1、MOD MOD(number1, number2) &#xff1a;返回一个数字除以另一个数字的余数。 语法&#xff1a; 1、MOD(number1, number2) 2、number1 MOD number2 3、number1 % number2 number1&#xff1a;被除数。 number2&#xff1a;除数。…

Qt学习系列之设计模式的小记录

Qt学习系列之设计模式的小记录 前言Qt中的设计模式使用情况数据模型视图组建代理 小tips虚函数&#xff1a;基类的不同具体使用界面设计后台显示 报错解决 总结 前言 在软件设计师中的设计模式有提到设计模式有三种类型&#xff1a; 创建型&#xff1a;工厂方法模式、抽象工厂…

上海AI实验室CVT-Occ时间融合利用视差搜索刷新occ3DWaymo SOTA

上海AI实验室提出CVT-Occ&#xff1a;通过时间融合利用视差搜索刷新occ3D-Waymo SOTA Abstract 基于视觉的3D占据预测由于单目视觉在深度估计上的固有局限性而面临显著挑战。本文介绍了CVT-Occ&#xff0c;一种新颖的方法&#xff0c;通过时间上的体素几何对应进行时间融合&a…

华为OD机试 - 最快到达医院的方法(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

欧洲气象局开源数据如何通过大模型预测未来天气

气象预测依赖于全球各地的观测数据、复杂的数学模型和高性能计算资源。欧洲气象局&#xff08;ECMWF&#xff0c;European Centre for Medium-Range Weather Forecasts&#xff09;作为世界领先的气象预报机构&#xff0c;不仅提供精确的天气预报服务&#xff0c;还向公众和科研…

获取鸿蒙设备Udid遇到的问题

参考官方文档&#xff1a;注册调试设备-调试应用&#xff08;HarmonyOS&#xff09;-AppGallery Connect帮助中心 - 华为HarmonyOS开发者 (huawei.com) 坑一&#xff1a;The sdk hdc.exe version is too low, please upgrade to the latest version. 升级dev工具和sdk配置为api…

google域名邮箱:如何创建并管理邮箱账户?

google域名邮箱设置教程&#xff1f;如何开通Google域名邮箱&#xff1f; Google域名邮箱提供了一个专业且功能强大的平台&#xff0c;允许用户使用自定义域名创建和管理邮箱账户。烽火将详细介绍如何创建并管理Google域名邮箱账户&#xff0c;帮助您充分利用这一强大的工具。…

Java Mail腾讯企业邮箱或其他邮箱发送邮件失败bug记录

问题出现情况 邮件发送时debug用F8逐步运行可以成功发送邮件&#xff0c;但是用F9或者直接运行程序却发送失败未开启mail的debug模式的报错日志是下面这个&#xff1a;org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is java…

基于RPA+AI的网页自动填写机器人 | OPENAIGC开发者大赛高校组优秀作品

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

TXS0104 LSF0102 原理理解

具体参数请查看数据手册&#xff0c;在此不必赘述了。TXS0104 数据手册 现主要对TXS0104 结构原理进行解析&#xff1a; 电平转换电路结构可参考如下电路&#xff1a; 对于gate bias 部分电路具体细节有兴趣的可以了解下。 对于LSF0102 系列的电平转换芯片 LSF0102 数据手…

【人工智能学习之PaddleOCR训练教程】

具体的训练教程&#xff1a; 准备数据集 OCR数据集 &#xff08;以下文字转载官方文档ocr_datasets&#xff09; 1. 文本检测 1.1 PaddleOCR 文字检测数据格式1.2 公开数据集 1.2.1 ICDAR 2015 2. 文本识别 2.1 PaddleOCR 文字识别数据格式2.2 公开数据集 2.1 ICDAR 2015 …