数据结构与算法之广度优先搜索

98 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

图的遍历方式及实现

从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历

在图结构中,存在着两种遍历搜索的方式,分别是 广度优先搜索深度优先搜索

广度优先搜索

广度优先搜索是一种用于图的查找算法,用于解决最短路径问题,可以帮助回答两类问题:

从节点A出发,有前往节点B的路吗?
从节点A出发,前往节点B的哪条路径最短?

1、查找有无路径?

  • 依次检查一度关系,查看能否相连
  • 如果能相连,则成功结束
  • 不能相连,将每一个一度关系的邻居加入查找名单
  • 循环,直到寻找到路径或者循环完毕

2、查找最短路径

  • 最短路径肯定会优先出现在一度关系,然后是二度关系,依次类推
  • 因此只有按顺序查找,才能实现这个目的,可实现这种目的的数据结构是队列(queue)

广度优先遍历(BFS):类似于图的层次遍历,它的基本思想是:首先访问起始顶点v,然后选取v的所有邻接点进行访问,再依次对v的邻接点相邻接的所有点进行访问,以此类推,直到所有顶点都被访问过为止

BFS和树的层次遍历一样,采取队列实现,这里添加一个标记数组,用来标记遍历过的顶点

在这里插入图片描述

执行步骤

  • 1、先把 A 压入队列,然后做出队操作,A 出队
  • 2、把 A 直接相关的顶点 ,B、F 做入队操作
  • 3、B 做出队操作,B 相关的点 C、I、G 做入队操作
  • 4、F 做出队操作,F 相关的点 E 做入队操作
  • 5、C 做出队操作,C 相关的点 D 做入队操作
  • 6、I 做出队操作(I 相关的点B、C、D 都已经做过入队操作了,不能重复入队)
  • 7、G 做出队操作,G 相关的点 H 做入队操作
  • 8、E 做出队操作...
  • 9、D 做出队操作...
  • 10、H 做出队操作,没有元素了

代码实现