广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索。BFS算法是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
算法思想
1、首先将根节点放入队列中。
2、从队列中取出第一个节点,并检验它是否为目标。
- 如果找到目标,则结束搜索并回传结果。
- 否则将它所有尚未检验过的直接子节点加入队列中。
3、若队列为空,表示整张图都检查过了——亦即图中没有欲搜索的目标。结束搜索并回传“找不到目标”。
4、重复步骤2。
搜索过程演示
说明
灰色的是加入队列中的活动节点,黑色是从活动节点队列中选取的扩展节点。
每次将一个活动节点标记为扩展节点后,进行判断,并将该点从活动节点队列中移除,再将该节点所有未检测的子节点加入活动节点队列中去。
接下来再从队列中选取新的活动节点作为扩展节点,如此循环下去,直至队列为空为止,说明已经遍历过所有的节点。
复杂度
因为所有节点都必须被存储,因此BFS的空间复杂度为 O(|V|+|E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。
最差情形下,BFS必须查找所有到可能节点的所有路径,因此其时间复杂度为 O(|V|+|E|)。
C++实现
//Given a binary tree, find its minimum depth.
//The minimum depth is the number of nodes along
//the shortest path from the root node down to
//the nearest leaf node.// 递归方法
class Solution
{public:int run(TreeNode *root) {if (!root){return 0;}// 若左子树为空,返回右子树深度 + 1if (root->left == nullptr){return (run(root->right) + 1);}// 若右子树为空,返回左子树深度 + 1if (root->right == nullptr){return (run(root->left) + 1);}// 左右子树都不为空,返回较小值int leftDepth = run(root->left);int rightDepth = run(root->right);return ((leftDepth < rightDepth) ? (leftDepth + 1) : (rightDepth + 1));}
};// BFS方法#include <vector>
using namespace std;
class Solution
{
public:int run(TreeNode *root){if (!root){return 0;}vector <TreeNode *> que;TreeNode *now = root; // 当前访问的节点TreeNode *last = root; // 每层最后的一个节点que.push_back(root);int depth = 1; // 初始深度while (que.size()){// 取出队列中的第一个节点作为当前节点now = que.front();que.erase(que.begin());// 如果当前节点没有子节点了,直接终止循环,说明是叶子节点,返回最小深度if ((now->left == nullptr) && (now->right == nullptr)){break;}// 将子节点加入队列中if (now->left != nullptr){que.push_back(now->left);}if (now->right != nullptr){que.push_back(now->right);}// 当访问到每层的最后一个节点时,深度+1if (now == last){depth++;last = que.back(); // 将下一层最后一个节点赋给last}}return depth;}};
BFS在迷宫问题的应用
MTK编程挑战赛决赛《算术迷宫》
References
- 深度优先搜索 - 维基百科,自由的百科全书
- 算法入门 广度/宽度优先搜索(BFS) - CSDN博客
- Algorithms: Graph Search, DFS and BFS - YouTube
转载于:https://www.cnblogs.com/Ran-Chen/p/9407300.html
广度优先搜索 BFS算法相关推荐
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
- JavaScript实现广度优先搜索BFS算法(附完整源码)
JavaScript实现广度优先搜索算法 LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList.js完整源代码 Queue.js完整源代码 brea ...
- 算法简介:层层递进----广度优先搜索(BFS)
算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...
- 算法复习|广度优先搜索BFS
广度优先搜索BFS 文章目录 广度优先搜索BFS HDU-1253 胜利大逃亡 HDU-1241 Oil Deposits 算法思想 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队 ...
- 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- 广度优先搜索(BFS)——抓住那头牛(POJ 4001)
本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...
- 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS
一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...
- 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)
[蓝桥杯]历届试题 青蛙跳杯子 问题描述 思路分析 代码实现 问题描述 题目链接:青蛙跳杯子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X星球的流行宠物是青蛙,一般有两种颜色: ...
- 数据结构与算法--图的广度优先搜索 (BFS)
广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...
最新文章
- 50句看后可以变换心情豁然开朗的话
- 电脑重装系统之后git pull报错 Permission denied (publickey)
- SIP 中的Dialog,call,session 和 transaction .
- 字体垂直居中_海报设计技巧!垂直轴式
- python做饼图出现重影_Matplotlib 绘制饼图解决文字重叠的方法
- golang判断结构体是否实现了某个接口
- Android利用温度传感器实现带动画效果的电子温度计
- hdu 1426(DFS+坑爹的输入输出)
- MyBatis防止SQL注入的方法
- 百度网盘青春版,免费不限速来了(使用体验)
- 连接linux工具Mtr,Mac、linux和windows mtr路径探测工具安装使用
- GIS常用数据平台网站
- java ajax教程_(转)JAVA AJAX教程第三章—AJAX详细讲解
- TFT-液晶显示屏的结构和原理
- 明解C语言 入门 课后习题练习答案 第四章(1)
- 4.(css3布局)使用flex布局携程网首页案例
- phpadmin 导入数据
- 【Bootstrap4】Bootstrap4 安装使用
- android+后台自动更新+上架,Android增量自动更新
- Metasploit的使用-入门