广度优先搜索算法(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算法相关推荐

  1. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  2. JavaScript实现广度优先搜索BFS算法(附完整源码)

    JavaScript实现广度优先搜索算法 LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList.js完整源代码 Queue.js完整源代码 brea ...

  3. 算法简介:层层递进----广度优先搜索(BFS)

    算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...

  4. 算法复习|广度优先搜索BFS

    广度优先搜索BFS 文章目录 广度优先搜索BFS HDU-1253 胜利大逃亡 HDU-1241 Oil Deposits 算法思想 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队 ...

  5. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  6. 广度优先搜索(BFS)——抓住那头牛(POJ 4001)

    本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...

  7. 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS

    一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...

  8. 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)

    [蓝桥杯]历届试题 青蛙跳杯子 问题描述 思路分析 代码实现 问题描述 题目链接:青蛙跳杯子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X星球的流行宠物是青蛙,一般有两种颜色: ...

  9. 数据结构与算法--图的广度优先搜索 (BFS)

    广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...

最新文章

  1. 50句看后可以变换心情豁然开朗的话
  2. 电脑重装系统之后git pull报错 Permission denied (publickey)
  3. SIP 中的Dialog,call,session 和 transaction .
  4. 字体垂直居中_海报设计技巧!垂直轴式
  5. python做饼图出现重影_Matplotlib 绘制饼图解决文字重叠的方法
  6. golang判断结构体是否实现了某个接口
  7. Android利用温度传感器实现带动画效果的电子温度计
  8. hdu 1426(DFS+坑爹的输入输出)
  9. MyBatis防止SQL注入的方法
  10. 百度网盘青春版,免费不限速来了(使用体验)
  11. 连接linux工具Mtr,Mac、linux和windows mtr路径探测工具安装使用
  12. GIS常用数据平台网站
  13. java ajax教程_(转)JAVA AJAX教程第三章—AJAX详细讲解
  14. TFT-液晶显示屏的结构和原理
  15. 明解C语言 入门 课后习题练习答案 第四章(1)
  16. 4.(css3布局)使用flex布局携程网首页案例
  17. phpadmin 导入数据
  18. 【Bootstrap4】Bootstrap4 安装使用
  19. android+后台自动更新+上架,Android增量自动更新
  20. Metasploit的使用-入门

热门文章

  1. 苹果大战FBI将加速科技圈的加密技术发展?
  2. Reboot分享第三期(已结束)
  3. 一个功能齐全的DataGrid分页例子
  4. 干货 | 华尔街留下的指标之王(附代码展示)
  5. nf_conntrack: table full, dropping packet 解决方案
  6. Mybatis之批量更新操作
  7. 打印html5中Canvas的方法
  8. JUnit 5 – 早期试用体验 – 第2篇
  9. SQL索引学习-聚集索引
  10. try-catch-finally中return的执行情况