【C++算法】队列相关经典算法题

1. N叉树的层序遍历

首先我们遇到这个题目,没有任何思路,我们就可以来模拟一下层序的流程,首先我们肯定是访问根节点1,访问之后呢就是访问下一层的最左节点3,此时第一层的节点1已经访问过了就可以不要了,然后访问第二层的中间节点2,最后访问最右边的节点4,然后就访问第三层,此时第二层最做节点就不要了,此时我们会发现此时就满足队列的先进先出的特点,知道用什么数据结构了我们就直接上思路:

直接上代码:

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret; //记录最终结果queue<Node*> q;  // 层序遍历需要的队列if(root == nullptr)return ret;q.push(root); // 队头元素入队while(!q.empty()){vector<int> tmp; //统计本层的节点int size = q.size(); //求出本层元素的个数while(size--){Node* n = q.front();q.pop();tmp.push_back(n->val);for(auto child : n->children) // 让孩子入队列{if(child != nullptr)q.push(child);}}ret.push_back(tmp);}return ret;}
};

2. 二叉树的锯齿形层序遍历

这个题目上给我们说了层序遍历,那么我们还是要用到队列,我们会发现,这道题和我们上道题目是一样的都是层序遍历,唯一的区别就是偶数层的遍历方式是我们之前的逆序,所以这道题目也很简单,直接上思路:

直接来写代码:

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ret;queue<TreeNode*> q;int flag = 1;//增加一个标记位,让偶数行的信息逆序即可if(root == nullptr) return ret;q.push(root);while(!q.empty()){vector<int> tmp;int size = q.size(); while(size--){TreeNode* front = q.front();q.pop();tmp.push_back(front->val);if(front->left != nullptr)q.push(front->left);if(front->right != nullptr)q.push(front->right);}if(flag == 1)ret.push_back(tmp);else{reverse(tmp.begin(),tmp.end());ret.push_back(tmp);}  flag *= -1;}return ret;}
};

3. 在每个树行中找最大值

我们这道题和之前的题目思路是一样的,只不过这个题目我们不需要统计每层的节点,只需要统计最大的哪一个节点即可,所以在层序遍历过程中,在执⾏让下⼀层节点⼊队的时候,我们可以在循环中统计出当前层结点的最大值的,直接上思路:

直接来写代码:

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ret;if(root == nullptr) return ret;queue<TreeNode*> q;q.push(root);while(q.size()) // 如果队列不为空{int maxnum = INT_MIN;int size = q.size();while(size--){TreeNode* t = q.front();q.pop();maxnum = max(maxnum, t->val); // 记录每层的最大值if(t->left) q.push(t->left);if(t->right) q.push(t->right);}ret.push_back(maxnum);}return ret;}
};

4.二叉树的最大宽度

题目解析:

这道题相较于上面三道题就有点难度了,这个题目男难就难在处理空节点,既然统计每一层的最大宽度,我们优先想到的就是利用层序遍历,把当前层的结点全部存在队列⾥面,利用队列的常度来计算每一层的宽度,统计出最大的宽度。但是,由于空节点也是需要计算在内的。因此,我们可以选择将空节点也存在队列⾥⾯。

⭐解法一:

这个思路是我们正常会想到的思路,但是极端境况下,最左边条长链,最右边⼀条长链,我们需要存几亿个空节点,会超过最内存限制。

⭐解法二:利用数组存储二叉树的方式,给节点编号

依旧是利⽤层序遍历,但是这⼀次队列⾥⾯不单单存结点信息,并且还存储当前结点如果在数组中存储所对应的下标(在我们学习数据结构堆的时候,计算左右孩子的方式)。

这样我们计算每⼀层宽度的时候,⽆需考虑空节点,只需将当层结点的左右结点的下标相减再加 1即可,我们直接上思路: 

魔鬼细节:

极端境况下,最左边条长链,最右边⼀条长链,我们需要存几亿个空节点,会超过最内存限制,那么此时我们的编号是2的1500次方,那么肯定会越界,此时无论什么数据类型我们都存不下,但是这个题最后我们是会进行减法的,但是我们数据的存储是⼀个环形的结构,并且题⽬说明,数据的范围在 int 这个类型的最大值的范围之内,因此不会超出⼀圈; 因此,如果是求差值的话,我们⽆需考虑溢出的情况,由于c++溢出使用int会报错,因此我们使用unsigned int来存储这个数据。直接上代码:

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {queue<pair<TreeNode*, unsigned int>> q;q.push({root,1}); // 根节点和编号入队unsigned int ret = 0; // 最大宽度while(q.size()){// 先更新这⼀层的宽度auto& [x1, y1] = q.front();auto& [x2, y2] = q.back();ret = max(ret, y2 - y1 + 1);int size = q.size();// 让下⼀层进队while(size--){auto [a,b] = q.front(); q.pop();if(a->left) q.push({a->left, 2*b});if(a->right) q.push({a->right,2*b+1});}}return ret;}
};

其实这道题我们也可以用数组来实现,但是这时候有人说了此时我们会经常进行删除节点,而删除节点都是头删,而数组的头删效率较低,你咋还使用我们的数组呢?确实是这样,但是我们进行删除节点不一定要头删,我们可以把本层的节点用tmp统计出来,然后拷贝给q即可。

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {vector<pair<TreeNode*,unsigned int>> q; // 用数组模拟队列 q.push_back(make_pair(root,1));unsigned int ret = 0;while(!q.empty()){// 先更新这⼀层的宽度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;}
};

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

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

相关文章

[GESP样题 四级] 填幻方和幸运数

B3940 [GESP样题 四级] 填幻方 题目 在一个NN 的正方形网格中&#xff0c;每个格子分别填上从 1 到 NN 的正整数&#xff0c;使得正方形中任一行、任一列及对角线的几个数之和都相等&#xff0c;则这种正方形图案就称为“幻方”&#xff08;输出样例中展示了一个33 的幻方&am…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习 1、 for i in range(3):Spaceship.step(4)for j in range(4):Dev.step(2)Dev.turnRight()Spaceship.turnLeft()Spaceship.step(4)Spaceship.turnRight()2、 for i in range(4):Spaceship.step(6)for j in range(3):…

Nginx或Tengine服务器配置SSL证书

目录 前提条件 步骤一&#xff1a;下载SSL证书 步骤二&#xff1a;在Nginx服务器安装证书 步骤三&#xff1a;验证SSL证书是否配置成功 前提条件 已通过数字证书管理服务控制台签发证书SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射已在Web服…

维修Philips IU22飞利浦四维多普勒彩超诊断仪 V6-2 L12-5 C8-4V深圳捷达工控维修

专为新时代而设计。专为更多而设计。 超声波在抗击 COVID-19 中的成像作用不断扩大&#xff0c;并且对血管和心脏检查的需求不断增加&#xff0c;因此比以往任何时候都更有价值。飞利浦的超声产品组合&#xff08;包括 EPIQ Elite&#xff09;为一线护理人员提供了宝贵的诊断支…

Intel处理器7z/XZ遇到 The failure in hardware

最近在使用Intel 12700H混合架构处理器的时候&#xff0c;一旦使用7z或者XZ算法压缩东西就会出现如下的报错&#xff1a; Internal Error: The failure in hardware (RAM or CPU), OS or program在检查排除了内存、磁盘和OS的问题后&#xff0c;最终确定为Intel CPU的问题&…

Lazada、Shopee测评自养号,快速出单技巧全解析!

每个人都憧憬着自己的店铺能够拥有一款或多款引人注目的热销商品&#xff0c;这些商品不仅能为店铺带来可观的收益&#xff0c;更重要的是它们能够成为吸引顾客的强大磁石&#xff0c;显著提升店铺的整体流量。一旦这样的爆款商品成功吸引顾客&#xff0c;其他产品也将随之受到…

C++11:并发新纪元 —— 深入理解异步编程的力量(1)

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《C11&#xff1a;并发新纪元 —— 深入理解异步编程的力量》&#xff0c;在这篇文章中&#xff0c;你将会学习到C新特性以及异步编程的好处&#xff0c;以及其如何带来的高性能的魅力&…

Python:通过接口获取公众号的文章列表(但是开发文档没有这个接口)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

【LeetCode】每日一题:2960. 统计已测试设备

给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages &#xff0c;表示 n 个设备的电池百分比。 你的任务是按照顺序测试每个设备 i&#xff0c;执行以下测试操作&#xff1a; 如果 batteryPercentages[i] 大于 0&#xff1a; 增加 已测试设备的计数。 将下标在 [i…

力扣HOT100 - 35. 搜索插入位置

解题思路&#xff1a; 二分法模板 class Solution {public int searchInsert(int[] nums, int target) {int left 0;int right nums.length - 1;while (left < right) {int mid left ((right - left) >> 1);if (nums[mid] target)return mid;else if (nums[mid…

【qt】设计器实现界面

设计器实现界面 一.总体思路二.具体操作1.创建项目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.转到槽7.实现槽函数 一.总体思路 二.具体操作 1.创建项目 这次咱们一定要勾选Generate form哦。 因为我们要使用设计器进行拖放。 2.粗略拖放 这里用到了复选框&#xff1a;C…

[数据集][目标检测]管道焊缝质量检测数据集VOC+YOLO格式1134张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1134 标注数量(xml文件个数)&#xff1a;1134 标注数量(txt文件个数)&#xff1a;1134 标注…

python元类与C#、Java中的反射

Python的元类和C#中的反射 在概念上有一定的相似性&#xff0c;但它们的目的和使用方式有所不同。 Python的元类&#xff1a; 元类&#xff08;Metaclass&#xff09;是控制类创建的类。它们定义了类的创建过程&#xff0c;可以修改类的行为。元类通过定制类的创建过程&…

算法训练营第二十五天 | LeetCode 669 修剪二叉树、

LeetCode 669 修剪二叉树 这题用层序遍历双指针删除不符合条件的节点即可。具体是要用到一个虚拟根节点&#xff0c;双指针中prev指针每次指向队列顶元素&#xff0c;cur指针先指向prev左子节点&#xff0c;用循环去除这个位置上不符合条件的节点并连上继承节点&#xff0c;内…

“我们坚持开源!”阿里云发布“地表最强”中文大模型:半年一迭代、性能翻倍?

5 月 9 日&#xff0c;在通义大模型发布一周年之际&#xff0c;阿里云大模型生态迎来一次重大升级&#xff0c;主要有“四个最”&#xff1a; 通义千问 2.5 正式发布&#xff0c;“模型性能全面赶超 GPT-4 Turbo&#xff0c;成为地表最强中文大模型”&#xff1b;Qwen1.5-110B…

卷积特征图与感受野

特征图尺寸和感受野是卷积神经网络中非常重要的两个概念&#xff0c;今天来看一下&#xff0c;如何计算特征尺寸和感受野。 特征图尺寸 卷积特征图&#xff0c;是图片经过卷积核处理之后的尺寸。计算输出特征的尺寸&#xff0c;需要给出卷积核的相关参数包括&#xff1a; 输…

PC端与bluetooth蓝牙虚拟串口通信

应该采用RFCOMM虚拟串口方式来进行通信&#xff0c;原理跟socket通信类似&#xff0c;不同的是使用的通信协议不同&#xff0c;本人结合相关的API&#xff0c;做了以下最简单的封装。 1、获取本地蓝牙设备与附近蓝牙设备信息 2、通信类 /* 通信类&#xff1a;只是对于客户端通…

基于Python实现单例模式

目录 1、使用装饰器实现 2、使用__new__方法实现 单例模式是一种设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景中都非常有用&#xff0c;以下是单例模式的一些常见应用场景&#xff1a; 应用程序的…

Spring线程池有哪些

目录 SimpleAsyncTaskExecutor SyncTaskExecutor ThreadPoolTaskExecutor ThreadPoolTaskScheduler Spring框架提供了多种线程池类型,以满足不同场景下的需求。以下是一些常见的Spring线程池类型: SimpleAsyncTaskExecutor 这个实现不重用任何线程,每次调用都会启动一…

抽空学学go

2024年5月9日11:14:24 学习go 看课8小时转职Golang工程师(如果你想低成本学习Go语言)_哔哩哔哩_bilibili 文档[8小时转职Golang工程师 (yuque.com)]( 1.安装go 2024年5月9日11:27:16 2.安装 vscode go配置环境 vs code配置go开发环境 (zhihu.com) vscode里面配置代理&…