所谓图的遍历,简单理解就是逐个访问图中的顶点,确保每个顶点都只访问一次。
图的遍历过程中,根据搜索方法的不同,又可以划分为两种搜索策略:
- 深度优先搜索(DFS,Depth First Search)
- 广度优先搜索(BFS,Breadth First Search)
深度优先搜索
算法思想
假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点, 然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图, 直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到, 则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
算法特点
深度优先搜索是递归过程,带有回退操作,因此需要使用栈存储访问的路径信息。
图解过程
1)
初始状态下,无向图中的所有顶点都是没有被访问过的,因此可以任选一个顶点出发,遍历整个无向图。
假设从 V1 顶点开始。
2)
紧邻 V1 的顶点有两个,分别是 V2 和 V3,它们都没有被访问过,从它们中任选一个,比如访问 V2。
3)
紧邻 V2 的顶点有三个,分别是 V1、V4 和 V5,尚未被访问的有 V4 和 V5,从它们中任选一个,比如访问 V4。
4)
紧邻 V4 的顶点有两个,分别是 V2 和 V8,只有 V8 尚未被访问,因此访问 V8。
5)
紧邻 V8 的顶点有两个,分别是 V4 和 V5,只有 V5 尚未被访问,因此访问 V5。
6)
和 V5 相邻的顶点有两个,分别是 V2 和 V8,它们都已经访问过了。也就是说,此时从 V5 出发,找不到任何未被访问的顶点了。
这种情况下,深度优先搜索算法会回退到之前的顶点,查看先前有没有漏掉的、尚未访问的顶点:
从 V5 回退到 V8,找不到尚未访问的顶点;
从 V8 回退到 V4,还是找不到尚未访问的顶点;
从 V4 回退到 V2,也还是找不到尚未访问的顶点;
从 V2 回退到 V1,发现 V3 还没有被访问。
于是,下一个要访问的顶点就是 V3。