什么是图的遍历
图的遍历是指从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。遍历过程中得到的顶点序列称为图遍历序列。
图的遍历过程中,根据搜索方法的不同,又可以划分为两种搜索策略:
- 深度优先搜索(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