队列+宽搜例题讲解!

429. N 叉树的层序遍历

题目解析:

根据题目分析,可以看出题目要我们求的是N叉数的层序遍历,就是把每层的放在一块,最后把每层都输出出来即可!

算法分析:

我们可以利用队列先进先出的特性进行求解,这里比层序遍历多了一个条件,记录当前层有多少个节点,然后只把当前层的节点出完即可,就是一层一层的进行输出,我们需要记录每层的节点的值,所以我们应该使用一个vector存储每层的节点,然后最终将每层的结点放到最终的vector中即可!

代码:

class Solution {
public:vector<vector<int>> levelOrder(Node* root){//定义一个队列用于进行出队的操作!queue<Node*> q;vector<vector<int>>ret;//首先判断给定的根节点是否为空,为空的话直接结束!if(root==nullptr){return ret;}//不为空!q.push(root);//当队中一直存在元素时,一直进行遍历即可!while(q.size()){//统计出本层的节点个数!//只需要进行出队len次,即可完成本次的出队操作!!int len=q.size();for(int i=0;i<len;i++){Node*tem=q.front();  //队头元素!q.pop();v.push_back(tem->val);  //将本层节点的值进行放入到vector中!for(Node* child:tem->children){//本次元素出队之后,将其孩子进行入队操作!if(child){q.push(child);}}}ret.push_back(v);}return ret;}
};


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


 

题目解析:

根据题目分析我们可以得出,题目要让我们第一次进行从左向右遍历,第二层进行从右向左遍历,如此往复,返回最终遍历的结果!

算法分析:

对于本题,还是和之前二叉树的变量一样,只不过是多了一个条件而言,相邻的每行的遍历顺序恰好相反,所以我们可以设置一个flag变量,用于标志何时进行逆置即可!当flag满足逆置的条件时,我们把本层结点的vector进行reverse即可!

代码

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root){vector<vector<int>>ret;queue<TreeNode*>q;if(root==nullptr){return ret;}int flag=1;q.push(root);while(q.size()){int len=q.size();//奇数为从左向右,偶数相反!//直接全部使用从左向右,对于偶数的情况!!我们只需要将得到的vector进行reverse然后再插入即可!vector<int>v;for(int i=0;i<len;i++){TreeNode*tem=q.front();q.pop();v.push_back(tem->val);//下一层元素进行入队!//左右孩子入队列!if(tem->left){q.push(tem->left);}if(tem->right){q.push(tem->right);}}if(flag==-1){reverse(v.begin(),v.end());}ret.push_back(v);flag*=-1;}return ret;}
};




662. 二叉树最大宽度

题目解析:

根据题目分析,我们可以得出题目要我们求出二叉树的最大宽度,其中最大宽度的定义为最左和左右的非空节点之间的长度!

算法分析:

我们可以利用堆中下标的思想,进行求解,我们在堆那边有一个公式,当根节点下标为0时,左孩子下标为2*parent+1,右孩子下标为左孩子+1。当根节点为1时,左孩子下标为2*parent,右孩子仍然是左孩子+1,根据下标的特性,我们可以求出二叉树的最大宽度!

代码:

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;}};


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

题目解析:

根据题目简单的介绍,我们可以得出题目要出的答案就是获取每层的最大值,然后进行push到结果数组中即可!

算法讲解:

还是和N叉数的层序遍历一样,我们还是需要记录的每层结点的个数,只不过本次我们需要引进一个新的变量,用于记录每层的最大值即可,我们开始将此变量置为INT_MIN即可!

代码: 

class Solution {
public:vector<int> largestValues(TreeNode* root){queue<TreeNode*>q;vector<int>ret;if(root==nullptr){return ret;}q.push(root);//当队列不为空的时候,一直进行循环即可!while(q.size()){   int m=INT_MIN;//求出本层的结点个数!int len=q.size();for(int i=0;i<len;i++){TreeNode*tem=q.front();q.pop();if(tem->val>m){m=tem->val;}//把下一层的元素压入到队列中!if(tem->left){q.push(tem->left);}if(tem->right){q.push(tem->right);}}ret.push_back(m);}return ret;}};

至此,本专题总结完毕,有疑问的小伙伴可以在评论区进行讨论。

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

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

相关文章

Machine Learning机器学习之K近邻算法(K-Nearest Neighbors,KNN)

目录 前言 背景介绍&#xff1a; 思想&#xff1a; 原理&#xff1a; KNN算法关键问题 一、构建KNN算法 总结&#xff1a; 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共…

基于大语言模型的云故障根因分析|顶会EuroSys24论文

*马明华 微软主管研究员 2021年CCF国际AIOps挑战赛程序委员会主席&#xff08;第四届&#xff09; 2021年博士毕业于清华大学&#xff0c;2020年在佐治亚理工学院做访问学者。主要研究方向是智能运维&#xff08;AIOps&#xff09;、软件可靠性。近年来在ICSE、FSE、ATC、EuroS…

人脸68关键点与K210疲劳检测

目录 人脸68关键点检测 检测闭眼睁眼 双眼关键点检测 计算眼睛的闭合程度&#xff1a; 原理: 设置阈值进行判断 实时监测和更新 拓展&#xff1a;通过判断上下眼皮重合程度去判断是否闭眼 检测嘴巴是否闭合 提取嘴唇上下轮廓的关键点 计算嘴唇上下轮廓关键点之间的距…

喜讯!聚铭网络荣获《日志分类方法及系统》发明专利

近日&#xff0c;聚铭网络又喜获一项殊荣&#xff0c;其申报的《日志分类方法及系统》发明专利成功获得国家知识产权局的授权&#xff0c;正式荣获国家发明专利证书。 在信息化时代&#xff0c;网络安全问题日益凸显&#xff0c;日志分析作为保障网络安全的重要手段&#xff…

SpringBoot多线程查询实战-查询库中所有数据多线程实现

文章目录 案例说明测试结论Controller层核心代码测试数据生成测试报告源码获取 案例说明 本案例我们希望使用三种方式查询数据库某张表下所有数据&#xff1a; 单线程分页查询获取所有数据单线程直接查询获取所有数据多线程分页查询获取所有数据 测试结论 ​ ​ ​在比较…

3D数据格式导出工具HOOPS Publish如何生成高质量3D PDF?

在当今数字化时代&#xff0c;从建筑设计到制造业&#xff0c;从医学领域到电子游戏开发&#xff0c;3D技术已经成为了不可或缺的一部分。在这个进程中&#xff0c;将3D模型导出为3D PDF格式具有重要的意义。同时&#xff0c;HOOPS Publish作为一个领先的解决方案&#xff0c;为…

通过Jmeter准备压测数据-mysql示例

1、新建线程组 总共30万条数据 2、创建jdbc链接 创建jdbc连接配置 配置mysql连接 需要在jmeter安装的路径\apache-jmeter-5.6.3\lib\ext 目录下添加mysql 驱动 3、创建jdbc请求 jdbc链接名称需要与上一步中的保持一致&#xff0c;同时添加insert语句 例如 INSERT INTO test…

iOS - Runtime-消息机制-objc_msgSend()

iOS - Runtime-消息机制-objc_msgSend() 前言 本章主要介绍消息机制-objc_msgSend的执行流程&#xff0c;分为消息发送、动态方法解析、消息转发三个阶段&#xff0c;每个阶段可以做什么。还介绍了super的本质是什么&#xff0c;如何调用的 1. objc_msgSend执行流程 OC中的…

阿里云实时计算Flink的产品化思考与实践【上】

摘要&#xff1a;本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。内容主要为以下五部分&#xff1a; 阿里云实时计算 Flink 简介产品化思考产品化实践SQL 产品化思考及实践展望 该主题由黄鹏程和陈婧敏共同完成&#xff0c;前半程…

java调用jacob进行文件转换ppt转pdf或者png

java调用jacob进行文件转换ppt转pdf或者png 前情提要 最近项目上&#xff0c;遇到一个复杂的ppt&#xff0c;最终要求是要将ppt每一页转成图片原本这个是不难&#xff0c;网上一搜一大堆案例&#xff0c;外加我本身也比较精通aspose&#xff0c;那还不是分分钟搞定。结果就是…

Django 中间件

【一】Django框架之生命周期流程图 【二】介绍 【1】概述 Django 中的中间件&#xff08;Middleware&#xff09;是一个轻量级、底层的“插件”系统&#xff0c;用来全局地改变 Django 的输入或输出。每个中间件组件负责处理特定的全局任务&#xff0c;例如处理会话、处理跨站…

【有限状态机】- FSM详细讲解 【附Autoware有限状态机模型代码讲解】

参考博客&#xff1a; &#xff08;1&#xff09;FSM&#xff08;有限状态机&#xff09; &#xff08;2&#xff09;关于有限状态机(FSM)的一些思考 &#xff08;3&#xff09;状态设计模式 1 状态机简介 有限状态机FSM&#xff1a;有限个状态以及在这些状态之间的转移和动作…

2024年最新最全Vue3开源后台管理系统复盘总结

在现代前端开发中&#xff0c;搭建一个高效、灵活、易用的后台管理系统并不容易。然而&#xff0c;Vue3 的出现为我们提供了一个备受瞩目的选择。作为一个现代化的前端框架&#xff0c;Vue3 具有众多优点&#xff0c;能够帮助开发者快速搭建企业级中后台产品原型。 今天&#…

iphoneX系统的参数

1. 2. 3. 4. 5.相关的网址信息 Apple iPhone X 規格、价格和评论 | Kalvo Apple iPhone X 規格、价格和评论 | Kalvo

UOS、Linux下的redis的详细部署流程(适用于内网)

提示&#xff1a;适用于Linux以及UOS等内外网系统服务器部署。 文章目录 一.上传离线包二.部署基本环境三.解压并安装redis四.后台运行redis五.uos系统可能遇到的问题六.总结 一.上传离线包 1.自己去Redis官网下载适配自己部署系统的redis安装包。 2.通过文件传输工具&#xf…

Rust使用原始字符串字面量实现Regex双引号嵌套双引号正则匹配

rust使用Regex实现正则匹配的时候&#xff0c;如果想实现匹配双引号&#xff0c;就需要使用原始字符串字面量&#xff0c;不然无法使用双引号嵌套的。r#"..."# 就表示原始字符串字面量。 比如使用双引号匹配&#xff1a; use regex::Regex;fn main() {println!(&qu…

快速幂算法在Java中的应用

引言&#xff1a; 在计算机科学和算法领域中&#xff0c;快速幂算法是一种用于高效计算幂运算的技术。在实际编程中&#xff0c;特别是在处理大数幂运算时&#xff0c;快速幂算法能够显著提高计算效率。本文将介绍如何在Java中实现快速幂算法&#xff0c;并给出一些示例代码和应…

151 shell编程,正则表达式,在C语言中如何使用正则表达式

零&#xff0c;坑点记录&#xff1a;bash 和 dash 的区别&#xff0c;导致的坑点 查看当前用的shell 是啥&#xff0c;用的是/bin/bash hunandedehunandede-virtual-machine:~$ echo $SHELL /bin/bash 当shell 脚本运行的时候&#xff08;后面会学到方法&#xff0c;这里是最…

全局UI方法-弹窗一警告弹窗(AlertDialog)

1、描述 显示警告弹窗组件&#xff0c;可设置文本内容与响应回调。 2、属性 名称参数类型参数描述showAlertDialogParamWithConfirm | AlertDialogParamWithButtons定义并显示AlertDialog组件。 2.1、AlertDialogParamWithConfirm对象说明&#xff1a; 参数名称参数类型必填…

『Apisix安全篇』探索Apache APISIX身份认证插件:从基础到实战

&#x1f680;『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 &#x1f4e3;读完这篇文章里你能收获到 &#x1f6e0;️ 了解APISIX身份认证的重要性和基本概念&#xff0c;以及如何在微服务架构中实施API安全。&#x1f511; 学习如何使…