队列+宽搜专题篇

embedded/2025/1/17 6:02:29/

目录

N叉树的层序遍历

二叉树的锯齿形层序遍历

二叉树最大宽度

在每个树行中找最大值


N叉树的层序遍历

题目

思路

使用队列+层序遍历来解决这道题,首先判断根节点是否为空,为空则返回空的二维数组;否则,就进行层序遍历,将每层节点依次取出,放入到二维数组中,并将取出的节点的孩子依次添加到队列中,最后返回二维数组。

代码

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()){int sz=q.size();vector<int> v;while(sz--){Node* tp=q.front();q.pop();v.push_back(tp->val);for(Node* child:tp->children)if(child!=nullptr) q.push(child);}ret.push_back(v);}return ret;}
};
二叉树的锯齿形层序遍历

题目

思路

使用队列+层序遍历来解决这道题,不过需要对偶数层的结果进行逆置,可以使用一个变量来记录当前层的层数,或者使用一个布尔变量来记录当前层是否是偶数层,将每层节点依次取出,如果当前层是偶数层,需要先将数组进行逆置,然后再将数组放入到二维数组中,并将取出的节点的孩子依次添加到队列中,最后返回二维数组。

代码

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ret;if(root==nullptr) return ret;queue<TreeNode*> q;q.push(root);bool flag=false;while(!q.empty()){int sz=q.size();vector<int> v;while(sz--){TreeNode* node=q.front();q.pop();v.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}if(flag) reverse(v.begin(),v.end());ret.push_back(v);flag=!flag;}return ret;}
};
二叉树最大宽度

题目

思路

首先我们可能会想到下面的方法,将空节点也加入到队列中,然后统计每一次一层非空节点之间空节点的数量,然后+2就是二叉树该行的最大宽度,但是这道题有可能是第二张图那种倒V型,这样就会导致我们队列存储的节点数量非常之多,因此这种方法看起来可行,但实际上是行不通的。

我们可能会想到对每个节点进行编号(受使用数组建堆的启发),根节点的编号可以从0开始也可以从1开始,虽然编号可能会溢出,但是差值是正确的,但是如果我们使用int来存储,溢出时会报错,因此我们使用unsigned int来存储宽度,解法依旧是使用队列+层序遍历,步骤和前几道题是一样的。

代码

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {vector<pair<TreeNode*,unsigned int>> q;q.push_back({root,1});unsigned int ret=0;while(!q.empty()){auto [a,b]=q[0];auto [c,d]=q.back();ret=max(ret,d-b+1);vector<pair<TreeNode*,unsigned int>> v;for(auto [x,y]:q){if(x->left) v.push_back({x->left,2*y});if(x->right) v.push_back({x->right,2*y+1});}q=v;}return ret;}
};
在每个树行中找最大值

题目

思路

使用队列+层序遍历来解决这道题,步骤和前几道题是一样的,无非是在遍历每一层时,将每一层的最大值记录下来,最后返回数组。

代码

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ret;if(root==nullptr) return ret;queue<TreeNode*> q;q.push(root);while(!q.empty()){int sz=q.size();vector<int> v;while(sz--){TreeNode* node=q.front();q.pop();v.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}ret.push_back(*max_element(v.begin(),v.end()));}return ret;}
};


http://www.ppmy.cn/embedded/115512.html

相关文章

Android-UI设计

控件 控件是用户与应用交互的元素。常见的控件包括&#xff1a; 按钮 (Button)&#xff1a;用于执行动作。文本框 (EditText)&#xff1a;让用户输入文本。复选框 (CheckBox)&#xff1a;允许用户选择或取消选择某个选项。单选按钮 (RadioButton)&#xff1a;用于在多个选项中…

计算机网络-小型综合网络的搭建涉及到无线路由交换安全

目录 1 拓扑架构 2 做项目的思路 3 做配置 3.1先做核心交换 3.2 防火墙的配置 4 ac 和ap 的配置 4.1 ac上配置安全的东西 5.1 测试​编辑 1 拓扑架构 要求看上面的图 2 做项目的思路 这张网很明显是一个小综合&#xff0c;设计到我们的无线交换&#xff0c;路由…

研究生第一次刷力扣day1

1.给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target 的那两个整数&#xff0c;并返回它们的数组下标 直接采用暴力求解&#xff0c;其他解答案看不懂 大致思想&#xff1a;先用len函数求出数组的长度n&#xff0c;然后一个个遍…

Java--File

FIle 概述 File的构造方法 > 1. 一个File对象代表硬盘中实际存在的一个文件或者目录。 > 2. 无论该路径下是否存在文件或者目录&#xff0c;都不影响File对象的创建。 代码演示&#xff1a; // 文件路径名 String pathname "D:\\aaa.txt"; File file1 new …

python中的排序函数sorted

在python中对列表进行排序是使用很频繁的操作&#xff0c;一般采用sorted函数或自带的成员函数sort就可以搞定。但是&#xff0c;sorted函数本身功能非常强大&#xff0c;可以对字符串长度、字典键值进行排序。使用下面的代码&#xff0c;可以更进一步的学习掌握。 # 对列表进…

PHP:强大的Web开发语言

PHP&#xff1a;强大的Web开发语言 一、PHP 简介及优势 PHP 的基本概念 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即 “超文本预处理器”&#xff0c;是一种通用开源脚本语言&#xff0c;最初由 Rasmus Lerdorf 于 1994 年创建。它可以在服务器上执行&#xf…

Unity UGUI的核心渲染组件

目录 Graphic Mask RectMask2D Graphic 在UGUI中常用的组件有Image、RawImage、Mask、RectMask2D、Text、InputField中&#xff0c;Image、RawImage、Text都继承自MaskableGraphic, MaskableGraphic 又继承自Graphic。所以Graphic是一个非常重要的类。让我们来对着Graphic的…

【AI大模型】LLM主流开源大模型介绍

目录 &#x1f354; LLM主流大模型类别 &#x1f354; ChatGLM-6B模型 2.1 训练目标 2.2 模型结构 2.3 模型配置(6B) 2.4 硬件要求 2.5 模型特点 2.6 衍生应用 &#x1f354; LLaMA模型 3.1 训练目标 3.2 模型结构 3.3 模型配置&#xff08;7B&#xff09; 3.4 硬件…