当前位置: 首页 > article >正文

【优选算法 | 队列 BFS】构建搜索流程的核心思维

在这里插入图片描述

算法相关知识点可以通过点击以下链接进行学习一起加油!
双指针滑动窗口二分查找前缀和位运算
模拟链表哈希表字符串模拟栈模拟(非单调栈)
优先级队列

很多人学 BFS 的时候都知道“用队列”,但为什么一定是队列?它到底在整个搜索流程中起了什么作用?
其实,掌握 BFS 的关键不是死记模板,而是搞懂“层层推进、状态过渡”这个思维模式,而队列正是这个模式的天然载体。

请添加图片描述

Alt

🌈个人主页:是店小二呀
🌈C/C++专栏:C语言\ C++
🌈初/高阶数据结构专栏: 初阶数据结构\ 高阶数据结构
🌈Linux专栏: Linux
🌈算法专栏:算法
🌈Mysql专栏:Mysql

🌈你可知:无人扶我青云志 我自踏雪至山巅 请添加图片描述

文章目录

    • 429. N 叉树的层序遍历
    • 103. 二叉树的锯齿形层序遍历
    • 662. 二叉树最大宽度
    • 515. 在每个树行中找最大值

429. N 叉树的层序遍历

题目】:429. N 叉树的层序遍历

在这里插入图片描述

算法思路

这道题的核心是实现 ‘利用队列进行层序遍历’。每次记录队列中的元素个数,从而确定循环次数。在遍历时,我们需要使用 for (Node* child : t->children) 来访问当前节点的所有子节点,并将它们依次入队,进入下一层的遍历。

在这里插入图片描述

代码实现

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/
class Solution {
public:vector<vector<int>> levelOrder(Node* root) {//1.创建相关容器vector<vector<int>> ret;queue<Node*> q;if(root == nullptr) return ret;q.push(root);//2.进行层序变量while(q.size()){int sz = q.size();vector<int> tmp;for(int i = 0; i < sz; i++){Node * t = q.front();q.pop();tmp.push_back(t -> val);for(Node* child : t->children) //认下一层节点入队{if(child != nullptr) q.push(child);}}ret.push_back(tmp);}//3.返回值return ret;}
};

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

题目】:103. 二叉树的锯齿形层序遍历

在这里插入图片描述

算法思路

在这里插入图片描述

代码实现

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {//1.创建容器vector<vector<int>> ret;queue<TreeNode*> q;if(root == nullptr) return ret;q.push(root);int level = 1;//2.进行层序遍历while(q.size()){int sz = q.size();vector<int> tmp;for(int i = 0; i < sz; i++){TreeNode* t = q.front();q.pop();tmp.push_back(t-> val);if(t->left) q.push(t->left);if(t->right) q.push(t->right);}   if(level % 2 == 0) reverse(tmp.begin(), tmp.end());level++;ret.push_back(tmp);}//3.返回值return ret;}
};

662. 二叉树最大宽度

题目】:662. 二叉树最大宽度

算法思路

解法一:硬来

在这里插入图片描述

虽然该解法对这道题不适用,但是可能对下一道题适用。该题如果出现,左边这种情况,啥类型范围都存储不下。

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

在这里插入图片描述

使用数组模拟队列时,通过 pair<TreeNode*, unsigned int> 来存储节点和编号。在每次循环中,利用 auto& [x1, y1] 拆解队列中的首尾编号,从而更新宽度。这种语法用于将复杂对象(如元组或 std::pair)解构为多个局部变量 x1y1

代码实现

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {//1.创建容器vector<pair<TreeNode*, unsigned int>> q;q.push_back({root,1});unsigned int ret = 0;//2.填表操作while(q.size()){//更新这一层的宽度(得到最后的数据)auto& [x1, y1] = q[0];auto& [x2, y2] = q.back();ret = max(ret, y2 - y1 + 1);//下一层进入队列vector<pair<TreeNode*, unsigned int>> ret;for(auto& [x, y] : q){if(x->left) ret.push_back({x->left, y*2});if(x->right) ret.push_back({x->right, y*2 + 1});}q = ret;}//3.返回值return ret;}
};

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

题目】:515. 在每个树行中找最大值

在这里插入图片描述

算法思路

在这里插入图片描述

代码实现

class Solution {
public:vector<int> largestValues(TreeNode* root) {//1.创建相关容器vector<int> ret;queue<TreeNode*> q;if(root == nullptr) return ret;q.push(root);//2.进行层序变量while(q.size()){int sz = q.size();int levelMax = INT_MIN;for(int i = 0; i < sz; i++){TreeNode * t = q.front();q.pop();if(levelMax < t-> val) levelMax = t ->val;if(t-> left) q.push(t-> left);if(t-> right) q.push(t-> right);}ret.push_back(levelMax);}//3.返回值return ret;}
};

在这里插入图片描述
快和小二一起踏上精彩的算法之旅!关注我,我们将一起破解算法奥秘,探索更多实用且有趣的知识,开启属于你的编程冒险!

http://www.lryc.cn/news/2396681.html

相关文章:

  • virtio介绍 (三)--spdk作为virtio后端处理nvme盘io的流程--上
  • 关于BackgroundScheduler的pause
  • 设计模式(行为型)-中介者模式
  • 【Java学习笔记】异常
  • MySQL:视图+用户管理+访问+连接池原理
  • neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理
  • C/C++ OpenCV 矩阵运算
  • 无人机桥梁3D建模的拍摄频率
  • ESP32-idf学习(三)esp32C3连接iot
  • 详解鸿蒙仓颉开发语言中的计时器
  • 【计算机网络】第3章:传输层—拥塞控制原理
  • Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)
  • 【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C
  • Cocos 打包 APK 兼容环境表(Android API Level 10~15)
  • 数据结构之堆:解析与应用
  • DBeaver导入/导出数据库时报错解决方案
  • GPIO模拟串口通信
  • uniapp与微信小程序开发平台联调无法打开IDE
  • 第十二节:第五部分:集合框架:Set集合的特点、底层原理、哈希表、去重复原理
  • 【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器
  • 基于大数据的个性化购房推荐系统设计与实现(源码+定制+开发)面向房产电商的智能购房推荐与数据可视化系统 基于Spark与Hive的房源数据挖掘与推荐系统设计
  • FFmpeg学习笔记
  • Chrome 通过FTP,HTTP 调用 Everything 浏览和搜索本地文件系统
  • GpuGeek如何成为AI基础设施市场的中坚力量
  • 【Hot 100】45. 跳跃游戏 II
  • Codeforces Round 1026 (Div. 2) C. Racing
  • Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块)
  • oracle sql 语句 优化方法
  • Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术
  • 代码随想录打卡|Day51 图论(dijkstra(堆优化版)精讲、Bellman_ford 算法精讲)