队列+宽搜例题讲解!

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

56. 合并区间(力扣LeetCode)

文章目录 56. 合并区间题目描述思路贪心算法方法一&#xff1a;直接在res中修改代码逻辑梳理&#xff1a; 方法二&#xff1a;在原数组中插入一个超出题目范围的数组代码逻辑梳理&#xff1a; 56. 合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单…

MyBatis-Plus分页接口实现教程:Spring Boot中如何编写分页查询

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

http响应练习—在服务器端渲染html(SSR)

一、什么是服务器端渲染&#xff08;SSR&#xff09; 简单说&#xff0c;就是在服务器上把网页生成好&#xff0c;整个的HTML页面生成出来&#xff0c;生成出的页面已经包含了所有必要的数据和结构信息&#xff0c;然后直接发给浏览器进行展现。 二、例题 要求搭建http服务&a…

白板手推公式性质 AR模型 时间序列分析

白板手推公式性质 AR模型 时间序列分析 视频讲解&#xff1a;https://www.bilibili.com/video/BV1D1421S76v/?spm_id_from.dynamic.content.click&vd_source6e452cd7908a2d9b382932f345476fd1 B站对应视频讲解(白板手推公式性质 AR模型 时间序列分析)

Java 学习和实践笔记(49):用javabean和一维数组的方式来存储表格数据

还是存储下面这个表格的数据&#xff0c;但使用另一种方法来做。 用javabean和一维数组的方法来做&#xff0c;示例代码如下&#xff1a; /*先创建一个类&#xff0c;其实就是创建好一个只有各属性列的空表格*/ class Employees {private int id;private String name;private …

【Linux进阶之路】理解UDP,成为TCP。

前言 学了TCP 和UDP之后&#xff0c;感觉UDP就像是初入职场的年轻人&#xff0c;两耳不闻 “窗外事”&#xff0c;只管尽力地把自己的事情做好&#xff0c;但收获的却是不可靠&#xff0c;而TCP更像是涉世极深的"职场老油条"&#xff0c;给人的感觉就是 “城府极深&a…

H12-831_338

多选题338、某园区部署OSPF实现网络互通&#xff0c;其中R2的LSDB如图所示。以下关于该LSDB信息的描述&#xff0c;错误的有哪些项? A.此时R4不能访间地址10.1.35.5/24&#xff0c;因为R4所在的Area l内没有泛洪R3-R5互联网段路由信息 B.Area l内无3类LSA&#xff0c;有7类1SA…

【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)

书接上文&#xff1a;创建一个项目 在经过cmakemsbuild顺利生成动态库之后&#xff0c;考虑到我一个项目可能会生成多个动态库&#xff0c;它们分散在build内的不同文件夹&#xff0c;我希望能将它们收拢到一个文件夹下&#xff0c;并将其回传到svn。 一、动态库移位—cmake实…

C# wpf 嵌入wpf控件

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件&#xff08;本章&#xff09; 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现&#xff1f;1、继承HwndHost2、添加Content属性3、创建wpf窗口并设置Content4、关闭wpf窗口 二、完整…

Flutter 常用插件Plugin整理并附带实例

最近有点空闲时间&#xff0c;正好写一篇文章&#xff0c;整理一下我们在Flutter开发中常用的插件Plugin使用并附带上实例。 在日常开发中&#xff0c;整个demo目前应该满足大家所有的开发需求&#xff0c;例如&#xff1a;http请求、列表刷新及加载、列表分组、轮播图、视频播…

ASP.Net添加Swagger注释

文章目录 Swagger添加Swagger注释 Swagger 添加Swagger注释 1、右击项目->选择属性->点击生成->输出&#xff0c;选中文档文件 2、配置服务 在program.cs 文件里配置SwaggerUI //增加项一 builder.Services.AddSwaggerGen(c> {c.SwaggerDoc("v1", ne…

新能源汽车充电桩主板的常见故障及解决办法

电桩主板作为充电桩的核心组件&#xff0c;直接影响着充电桩运行的安全性与稳定性。然而&#xff0c;在使用过程中&#xff0c;充电桩主板会因多种原因而出现一些故障情况&#xff0c;了解这些原因并采取相应的应对方法对维护充电桩的正常运行起着至关重要的作用。接下来&#…

【自我提升】一、Hyperledger Fabric 概念梳理

写在前面&#xff1a;最近因为业务需要&#xff0c;开始学习Hyperledger Fabric了&#xff0c;做java全栈工程师可真难搞。现在算是啥类型的都在涉及了&#xff0c;现在这个技术啥都不懂&#xff0c;就先开个学习专栏&#xff0c;记录记录。顺带也给各位道友参考参考。 目录 …

文献阅读工具-->Adobe pdf + 有道词典

Adobe pdf 有道词典 最近一直在考虑用什么文献阅读工具&#xff0c;痛点无非就是想用翻译功能&#xff0c;Adobe pdf的添加注释已经很好用了&#xff0c;使用了zotero&#xff0c;感觉不行&#xff08;不能直接对原文件修改&#xff0c;有副本&#xff0c;麻烦&#xff09;。…

vue + LogicFlow 实现流程图展示

vue LogicFlow 实现流程图展示 1.背景 部门主要负责低代码平台&#xff0c;配置端负责配置流程图&#xff0c;引擎端负责流程执行&#xff0c;原引擎端只负责流程执行控制以及流程历史列表展示。现在提出个新的要求&#xff0c;认为仅历史记录不直观&#xff0c;需要在展示完…

Unity学习日记 11.单词识别游戏

目录 1.返回鼠标单击对象的名字 2.鼠标拖动移动对象 3.实现鼠标跟随 4.场景准备工作 5.判断图片与框配对 6.根据配对结果放置图片 1.返回鼠标单击对象的名字 步骤&#xff1a; 创建一个ShowName的脚本&#xff0c;并挂载在摄像机上 RaycastHit2D hitInfo;void Update(){…

Tensorflow2.0笔记 - 使用compile,fit,evaluate,predict简化流程

本笔记主要用compile, fit, evalutate和predict来简化整体代码&#xff0c;使用这些高层API可以减少很多重复代码。具体内容请自行百度&#xff0c;本笔记基于FashionMnist的训练笔记&#xff0c;原始笔记如下&#xff1a; Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…

【旅游景点项目日记 | 第一篇】项目服务架构、数据库表设计

Gitee仓库地址&#xff1a;travel-server&#xff1a;景点旅游项目服务端 文章目录 1.项目服务架构2.数据库设计2.1用户服务—travel_ums2.1.1 ums_user—用户表 2.2景点服务—travel_ams2.2.1 ams_attraction—景点表1.2.2 ams_resource_type—资源类型表 2.3票务服务—trabel…

前端框架的简单介绍

html html-结构 盖房子之前先划三室二厅 &#xff08;超文本标记语言&#xff09;(可以实现一切的文本) css css-样式 在房里添家具 &#xff08;层叠样式单&#xff09;(化妆在脸上叠加) javascript(js) javascript(js)-交互(行为) 我点击你打开 供显示信息的元…

持续集成与版本控制的相关概念

目录 一、持续集成 1.1 持续集成基本概念 1.1.1 持续集成的含义 1.1.1.1 持续集成流程是依赖产品版本迭代和版本分支而产生的 1.1.1.2 持续集成流程中包含的内容 1.1.2 传统打包模式说明 1.1.2.1 传统打包模式概述 1.1.2.2 传统打包模式问题 1.1.3 持续集成模式 1.1.…