【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服…

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;&…

力扣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 标注…

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

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;只是对于客户端通…

抽空学学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里面配置代理&…

全志ARM-SG90舵机

控制转角 向黄色信号线“灌入”PWM信号。 PWM波的频率不能太高&#xff0c;50hz&#xff0c;即周期1/频率1/500.02s&#xff0c;20ms左右数据&#xff1a; 不同的PWM波形对应不同的旋转角度&#xff0c;以20ms为周期&#xff0c;50hz为频率的PWM波 定时器需要定时20ms,关心的单…

vue阶段案例,练习filter、map、forEach,双向绑定,三元表达式,以及图片滚动,文字跳动等等。

阶段案例 通过案例来练习双向绑定&#xff0c;三元表达式&#xff0c;以及图片滚动&#xff0c;文字跳动等等。 代码如下&#xff1a; <template><table class"bjtp" ><div class"title" >{{title}}</div><div class"s…

【解决Android Studio】cmake报错找不到vulkan包

1 报错信息 CMake Error at D:/Android/project/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message): Could NOT find Vulkan (missing: Vulkan_LIBRARY) Call Stack (most recent call first): 2. 错误原因 minSdk版本不对&am…

18.Blender 渲染工程、打光方法及HDR贴图导入

HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角&#xff0c;点击箭头&#xff0c;展开详细部分 点击材质球&#xff0c;会出现下面一列材质球&#xff0c;将鼠标拖到第二个材质球&#xff0c;会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…

动作识别 slowfast动作识别项目记录

动作识别 slowfast动作识别项目记录

如何在自己的服务器上快速搭建第一个网站(其一)

根据上篇文章相信很多人以及成功搭建服务器啦。今天我们讲下如何在自己的服务器快速搭建第一个网站的一些重要配置&#xff0c;以及搭建网站的必备环境。干货满满&#xff0c;希望大家能够关注点赞收藏。 我会不定期更新一些实用的工具&#xff0c;欢迎大家私信评论喔&#xf…

12个网上赚钱野路子信息差,人人可做的赚钱小项目!

在这个多元化的时代&#xff0c;副业已经成为许多人增加收入、实现自我价值的重要途径。今天&#xff0c;我们就来聊聊那些既有趣又能赚钱的副业项目&#xff0c;让你的钱包鼓起来&#xff01; 1.文字创作 写作不仅是情感的宣泄&#xff0c;更是财富的积累。无论是自媒体文、软…