转载

宽度优先搜索(BFS, Breadth First Search)是一个针对图和树的遍历算法。发明于上世纪50年代末60年代初,最初用于解决迷宫最短路径和网络路由等问题。

对于下面的树而言,BFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8。 

BFS使用队列(queue)来实施算法过程,队列(queue)有着先进先出FIFO(First Input First Output)的特性,BFS操作步骤如下: 
1、把起始点放入queue; 
2、重复下述2步骤,直到queue为空为止: 
1) 从queue中取出队列头的点; 
2) 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入queue中。

下面结合一个图(graph)的实例,说明BFS的工作过程和原理: 
(1)将起始节点1放入队列中,标记为已遍历: 

(2)从queue中取出队列头的节点1,找出与节点1邻接的节点2,3,标记为已遍历,然后放入queue中。 

(3)从queue中取出队列头的节点2,找出与节点2邻接的节点1,4,5,由于节点1已遍历,排除;标记4,5为已遍历,然后放入queue中。 

(4)从queue中取出队列头的节点3,找出与节点3邻接的节点1,6,7,由于节点1已遍历,排除;标记6,7为已遍历,然后放入queue中。 

(5)从queue中取出队列头的节点4,找出与节点4邻接的节点2,8,2属于已遍历点,排除;因此标记节点8为已遍历,然后放入queue中。 

(6)从queue中取出队列头的节点5,找出与节点5邻接的节点2,8,2,8均属于已遍历点,不作下一步操作。 

(7)从queue中取出队列头的节点6,找出与节点6邻接的节点3,8,9,3,8属于已遍历点,排除;因此标记节点9为已遍历,然后放入queue中。 

(8)从queue中取出队列头的节点7,找出与节点7邻接的节点3, 9,3,9属于已遍历点,不作下一步操作。 

(9)从queue中取出队列头的节点8,找出与节点8邻接的节点4,5,6,4,5,6属于已遍历点,不作下一步操作。 

(10)从queue中取出队列头的节点9,找出与节点9邻接的节点6,7,6,7属于已遍历点,不作下一步操作。 

(11)queue为空,BFS遍历结束。

宽度优先搜索用于二叉树遍历:

// 用queue实现的BFS
void BFS(Node *pRoot)
{if (pRoot==NULL)return;queue<Node*> Q;Q.push(pRoot);while(!Q.empty()){Node *node = Q.front();cout<<node->nVal<<"->";if (node->pLeft!=NULL){Q.push(node->pLeft);}if (node->pRight!=NULL){Q.push(node->pRight);}Q.pop();}cout<<endl;
}
// temp-test.cpp: 定义控制台应用程序的入口点。
//
#include<iostream>
#include <queue>
#include<stack>
using namespace std;struct Node
{int nVal;Node *pLeft;Node *pRight;Node(int val, Node* left = NULL, Node * right = NULL) :nVal(val), pLeft(left), pRight(right) {}; //构造
};
// 析构
void DestroyTree(Node *pRoot)
{if (pRoot == NULL)return;Node* pLeft = pRoot->pLeft;Node* pRight = pRoot->pRight;delete pRoot;pRoot = NULL;DestroyTree(pLeft);DestroyTree(pRight);}// 用queue实现的BFS
void BFS(Node *pRoot)
{if (pRoot == NULL)return;queue<Node*> Q;Q.push(pRoot);while (!Q.empty()){Node *node = Q.front();cout << node->nVal << "->";if (node->pLeft != NULL){Q.push(node->pLeft);}if (node->pRight != NULL){Q.push(node->pRight);}Q.pop();}cout << endl;
}// DFS的递归实现
void DFS_Recursive(Node* pRoot)
{if (pRoot == NULL)return;cout << pRoot->nVal << " ";if (pRoot->pLeft != NULL)DFS_Recursive(pRoot->pLeft);if (pRoot->pRight != NULL)DFS_Recursive(pRoot->pRight);}// DFS的迭代实现版本(stack)
void DFS_Iterative(Node* pRoot)
{if (pRoot == NULL)return;stack<Node*> S;S.push(pRoot);while (!S.empty()){Node *node = S.top();cout << node->nVal << ",";S.pop();if (node->pRight != NULL){S.push(node->pRight);}if (node->pLeft != NULL){S.push(node->pLeft);}}}// 打印树的信息
void PrintTree(Node* pRoot)
{if (pRoot == NULL)return;cout << pRoot->nVal << " ";if (pRoot->pLeft != NULL){PrintTree(pRoot->pLeft);}if (pRoot->pRight != NULL){PrintTree(pRoot->pRight);}
}int main()
{Node *node1 = &Node(4);Node *node2 = &Node(5);Node *node3 = new Node(6);Node* node4 = new Node(2, node1, node2);Node* node5 = new Node(3, node3);Node* node6 = new Node(1, node4, node5);Node* pRoot = node6;//PrintTree(pRoot);//DFS_Recursive(pRoot);BFS(pRoot);DFS_Iterative(pRoot);//DestroyTree(pRoot);system("pause");return 0;
}

//以上完整版图的深度和广度实例。

图/树——宽度优先搜索(BFS)相关推荐

  1. 广度/宽度优先搜索(BFS)详解

    1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名. 一般可以用它做什么呢?一 ...

  2. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/04/27 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述) ...

  3. (宽度优先搜索)bfs(包含所有模型)

    持续更新中(点个赞吧) 首先,我们要了解什么是bfs: 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型. 其实bfs是盲目的搜索周围,知道搜到目的 ...

  4. 野人与传教士——宽度优先搜索(完整报告,含全部代码)

    题目: 野人与传教士渡河问题:3个野人与3个传教士打算乘一条船到对岸去,该船一次最多能运2个人,在任何时候野人人数超过传教士人数,野人就会把传教士吃掉,如何用这条船把所有人安全的送到对岸?在实现基本程 ...

  5. 深度优先搜索和宽度优先搜索

    深度优先搜索和宽度优先搜索 bfs和dfs都是遍历图的方法.dfs是不撞南墙不回头,bfs慢慢来,一层一层来. 类型 空间(h为高度) 时间(h为高度) 采用的数据结构 特点 DFS O(h) O( ...

  6. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

  7. 生成图-深度优先搜索/宽度优先搜索

    问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...

  8. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

    广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS) 1. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first searc ...

  9. 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)

    文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...

最新文章

  1. Batch Normalization的诅咒
  2. 450g吐司烘烤温度_美晨烘焙丨会吐蛋黄的黄金吐司
  3. 数据结构特性解析 (二) ArrayList
  4. 如何使用 sklearn 优雅地进行数据挖掘?
  5. 20220129--CTF WEB方向刷题-- WP--非常简单的webshell题
  6. P6846-[CEOI2019]Amusement Park【状压dp,FWT】
  7. Java中static final用法小结
  8. 智能门锁半夜离奇开门吓坏用户 官方回应:只是一场误解
  9. jQuery.fn.extend()方法
  10. 请没有买房和买车的朋友一定认真的看一下
  11. USB xHCI控制器使用总结
  12. 记录某学校热水卡安全性研究
  13. java避免出现科学计数法表示_Java中的浮点数-科学计数法-加减乘除
  14. 语音邮件 voice mail 概述
  15. 乐吾乐零部件拆解可视化解决方案
  16. 计算机主机通电启动不了,电脑不通电,开机没反应?这里有问题!
  17. Tableau学习Step2一数据文件的读取与统计图、表的概述
  18. 骨传导黑科技新秀-Nineka南卡骨传导耳机,运动最佳伴侣
  19. 如何修改视频分辨率?
  20. 均衡发展国检时计算机会问哪些问题,XX小学均衡发展迎国检工作方案.doc

热门文章

  1. Python--几种set集合去重的方法
  2. 在线流程图和思维导图开发技术详解(四)
  3. Excel分类汇总2个维度的结果,1个计数1个求和
  4. html图片向上,CSS实现图片向上浮动
  5. centos7.9-kvm-ESXi相关操作
  6. python入门——热量转换 I
  7. android 获取sn序列号
  8. ubuntu安装Kubernetes1.20.0
  9. 使用 BOL API 创建 SAP CRM IBASE 数据
  10. Vulkan【1】介绍