导航

图的遍历

Posted on 2022-10-22 15:42  20221301  阅读(197)  评论(0编辑  收藏  举报

什么是图的遍历

图的遍历是指从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。遍历过程中得到的顶点序列称为图遍历序列。

图的遍历过程中,根据搜索方法的不同,又可以划分为两种搜索策略:

  • 深度优先搜索(DFS,Depth First Search)
  • 广度优先搜索(BFS,Breadth First Search)

DFS

最直观的例子就是“走迷宫”。假设你站在迷宫的某个岔路口,然后想找到出口。你随意选择一个岔路口来走,走着走着发现走不通的时候,你就回退到上一个岔路口,重新选择一条路继续走,直到最终找到出口。这种走法就是一种深度优先搜索策略。
对于图来说:

思想

  • 假设初始状态是图中所有顶点均未被访问
  • 从某个顶点出发,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。
  • 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
  • 实现深度优先遍历的关键在于回溯。所谓“回溯”,就是自后往前,追溯曾经走过的路径。


假设我们从顶点0开始,遍历过程中的每一步如下:

  • 首先选取顶点0为起始点,输出0顶点信息,而且将0入栈,并且标记0为已访问顶点
  • 0的邻接顶点有1、2、5,从中任意选取一个顶点前进。这里我们选取1为前进位置顶点。输出1顶点信息,将1入栈,并标记1为已访问顶点。当前位置指向顶点1
  • 顶点1的邻接顶点有0、2,此时0已经标记为已访问顶点,因此不能继续访问。选取2顶点为前进位置顶点。输出2顶点信息,将2入栈,标记2顶点为已访问顶点。当前位置指向2
  • 顶点2的邻接顶点只有0、1,3,4,其中0,1已被标记,不能继续访问,因此从3,4中选取,选取4为前进位置顶点,输出4顶点信息,将4入栈,标记4顶点,当前位置指向4。
  • 顶点4的邻接顶点有2,3,其中2已被标记,不能继续访问,因此选取3为前进位置顶点,输出3顶点信息,将3入栈,标记3顶点,当前位置指向3。
  • 顶点3的邻接顶点有2,4,5,其中2,4已被标记,不能继续访问,因此选取5为前进位置顶点,输出5顶点信息,将5入栈,标记5顶点,当前位置指向5。此时所有顶点均被访问。
    采用深度优先搜索遍历顺序为0->1->2->4->3->5。

BFS

思想:

  • 从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点
  • 然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。
  • 如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。
  • 实现广度优先遍历的关键在于回放。


  • 我们先遍历顶点0,然后遍历其邻接点1,2,5

  • 接下来我们要遍历更外围的顶点,可是如何找到这些更外围的顶点呢?我们需要把刚才遍历过的顶点1,2,5按照顺序回顾一遍,从顶点2发现了邻接点3,4,从顶点5发现了邻接点3。

  • 参考https://blog.csdn.net/zhizhengguan/article/details/122468043