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

article/2025/7/5 18:01:24

在这里插入图片描述

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

很多人学 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.hkcw.cn/article/QHSnWccriy.shtml

相关文章

Retrievers检索器+RAG文档助手项目实战

导读&#xff1a;作为企业级应用开发中的关键技术&#xff0c;LangChain检索器&#xff08;Retrievers&#xff09;正成为构建高效RAG系统的核心组件。本文将深入探讨检索器的技术架构与实战应用&#xff0c;帮助开发者掌握这一重要的AI工程技术。 检索器的价值在于提供统一的检…

word中如何快速调整全部表格大小

Step1: 选中一个表格&#xff0c;然后在自动调整选项卡中选择“根据窗口调整表格大小” Step2&#xff1a;选中其他表格 Step3: 按F4即可快速调整

设计模式——中介者设计模式(行为型)

摘要 文章详细介绍了中介者设计模式&#xff0c;这是一种行为型设计模式&#xff0c;通过中介者对象封装多个对象间的交互&#xff0c;降低系统耦合度。文中阐述了其核心角色、优缺点、适用场景&#xff0c;并通过类图、时序图、实现方式、实战示例等多方面进行讲解&#xff0…

20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s

20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s 2025/6/2 18:15 缘起&#xff1a;有些时候&#xff0c;需要在uboot阶段做一些事情。 于是&#xff0c;希望在荣品的PRO-RK3566开发板的Android13下的uboot启动停下。 1、【原始的LOG&#xff…

汽车安全体系:FuSa、SOTIF、Cybersecurity 从理论到实战

汽车安全&#xff1a;功能安全&#xff08;FuSa&#xff09;、预期功能安全&#xff08;SOTIF&#xff09;与网络安全(Cybersecurity) 从理论到实战的安全体系 引言&#xff1a;自动驾驶浪潮下的安全挑战 随着自动驾驶技术从L2向L4快速演进&#xff0c;汽车安全正从“机械可靠…

学习经验分享【40】目标检测热力图制作

目标检测热力图在学术论文&#xff08;尤其是计算机视觉、深度学习领域&#xff09;中是重要的可视化分析工具和论证辅助手段&#xff0c;可以给论文加分不少。主要作用一是增强论文的可解释性与说服力&#xff1a;论文中常需解释模型 “如何” 或 “为何” 检测到目标&#xf…

C++ 检查一条线是否与圆接触或相交(Check if a line touches or intersects a circle)

给定一个圆的圆心坐标、半径 > 1 的圆心坐标以及一条直线的方程。任务是检查给定的直线是否与圆相交。有三种可能性&#xff1a; 1、线与圆相交。 2、线与圆相切。 3、线在圆外。 注意&#xff1a;直线的一般方程是 a*x b*y c 0&#xff0c;因此输入中只给出常数 a、b、…

判断用户输入昵称是否存在(Python)

一、运行结果 二、源代码 # 创建一个存储昵称的列表&#xff1b; name_list [章鱼, 张愚, 宇文弑]# 循环输入判断用户输入昵称是否存在 while True:# 获取用户输入的昵称&#xff1b;name input(请输入昵称&#xff1a;)# 判断昵称是否存在&#xff1b;if name in name_list…

RAG理论基础总结

目录 概念 流程 文档收集和切割 读取文档 转换文档 写入文档 向量转换和存储 搜索请求构建 向量存储工作原理 向量数据库 文档过滤和检索 检索前 检索 检索后 查询增强和关联 QuestionAnswerAdvisor查询增强 高级RAG架构 自纠错 RAG&#xff08;C-RAG&#xf…

pikachu靶场通关笔记09 XSS关卡05-DOM型XSS-X

目录 一、XSS 二、DOM型XSS 三、源码分析 1、打开DOM-X型XSS关卡 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 五、DOM型XSS与DOM-X型XSS区别 本系列为通过《pikachu靶场通关笔记》的XSS攻击关卡(共10关&#xff09;渗透集合&#xf…

3. TypeScript 中的数据类型

在 TypeScript 中&#xff0c;类型&#xff08;Types&#xff09;允许你定义并强制执行应用中数据的结构。通过使用类型&#xff0c;你可以在编译阶段捕捉错误&#xff0c;而不是等到运行时才发现&#xff0c;从而让代码更加可预测&#xff0c;也更不容易出现 bug。TypeScript …

【Java Web】速通Tomcat

参考笔记:JavaWeb 速通Tomcat_tomcat部署java项目-CSDN博客 目录 一、Tomcat服务 1. 下载和安装 2. 启动Tomcat服务 3. 启动Tomcat服务的注意事项 4. 关闭Tomcat服务 二、Tomcat的目录结构 1. bin 🌟 2. conf 🌟 3. lib 4. logs 5. temp 6. webapps 7. work 三、Web项目…

从零实现Python扫雷游戏:完整开发指南与深度解析

目录 一、游戏架构设计 1.1 核心组件 1.2 类结构设计 二、核心算法实现 2.1 地雷生成算法 2.2 数字计算算法 2.3 空白区域展开算法 三、图形界面开发 3.1 主界面布局 3.2 交互事件处理 左键点击事件 右键点击事件 3.3 游戏状态显示 四、游戏功能扩展 4.1 多难度…

hooks组件-useState

hooks组件-useState hook组件的本质就是函数组件&#xff0c;但是基于各种hook让其动态化&#xff01; 常用hook&#xff1a; useReducer&#xff1a;redux useCallback useMemo&#xff1a;去做一些优化。 useRef&#xff1a;使用ref useImperativeHandle&#xff1a;拿到子组…

X浏览器APP:轻巧快捷,畅享极速浏览

在移动互联网时代&#xff0c;浏览器作为我们获取信息、娱乐和社交的重要工具&#xff0c;其性能和功能直接影响着我们的使用体验。X浏览器APP正是这样一款专为移动设备设计的轻巧快捷的网络浏览器&#xff0c;它凭借独特的核心引擎和多项实用功能&#xff0c;为用户提供了极速…

一种基于性能建模的HADOOP配置调优策略

1.摘要 作为分布式系统基础架构的Hadoop为应用程序提供了一组稳定可靠的接口。该文作者提出了一种基于集成学习建模的Hadoop配置参数调优的方法。实验结果表明&#xff0c;该性能模型可以准确预测MapReduce应用程序的运行时间。采用提出的Hadoop配置参数方法调优后&#xff0c…

【001】利用github搭建静态网站_essay

文章目录 1. 简介2. 先了解网址规则2.1 文件及网址形式2.2 相互访问 3. 搭建网页的过程3.1 网页文件3.2 github搭建仓库及文件上传3.3 搭建网站 1. 简介 相信大家都有过想要自己搭建一个稳定可靠的网站&#xff0c;github是一个不错的选择&#xff0c;本来国内有gitee可以搭建…

太极APP:免Root,畅享Xposed模块的神奇魅力

在安卓系统中&#xff0c;Xposed框架一直以其强大的功能和高度的自定义能力受到众多用户的喜爱。然而&#xff0c;传统的Xposed框架需要Root权限和复杂的刷机操作&#xff0c;这使得许多普通用户望而却步。太极APP的出现&#xff0c;打破了这一限制&#xff0c;它为用户提供了一…

大学专业解读——电子信息

家里娃要高考了&#xff0c;面临专业和学校选择的问题。虽然我们家长做为职场人已经工作超过30年&#xff0c;但实际上对于专业和就业的问题&#xff0c;也不是太懂&#xff0c;网上有很多营销号在讲专业的志愿填报&#xff0c;但信息都比较碎片。所以&#xff0c;抽出一点时间…

实验一:PyTorch基本操作实验

import torch # PyTorch中初始化矩阵常见有以下几种方法 # 1. 直接使用固定值初始化 # M torch.tensor([[1.0, 2.0, 3.0]]) # 1x3矩阵 # 2. 随机初始化 # M torch.rand(1, 3) # 1x3矩阵&#xff0c;元素在0-1之间均匀分布 # M torch.randn(1, 3) # 1x3矩阵&#xff0c;元…