0
点赞
收藏
分享

微信扫一扫

数据结构与算法--图的深度优先搜索 (DFS)

干自闭 2022-04-02 阅读 46

        深度优先搜索即是 从起点出发,从规定的方向中选择一个不断往前走,走到头为止,然后尝试另一种方向直到最后的终点。

        

假设有一个图,里面有ABCDEFGH 8 个顶点,对这个图进行深度优先的遍历

第一步 选择一个起始顶点,例如从顶点 A 开始。把 A 压入栈,标记它为访问过(用红色标记),并输出到结果中。

 

第二步 寻找与 A 相连并且还没有被访问过的顶点,顶点 A BDG 相连,而且它们都还没有被访问过,我们按照字母顺序处理,所以将 B 压入栈,标记它为访问过,并输出到结果中。

 

第三步 现在我们在顶点 B 上,重复上面的操作,由于 B AEF 相连,如果按照字母顺序处理的话,A 应该是要被访问的,但是 A 已经被访问了,所以我们访问顶点 E,将 E 压入栈,标记它为访问过,并输出到结果中。

 

第四步 E 开始, E B G 相连,但是 B 刚刚被访问过了,所以下一个被访问的将是 G ,把 G 压入栈,标记它为访问过,并输出到结果中。

第五步 现在我们在顶点 G 的位置,由于与 G 相连的顶点都被访问过,所以我们这里要做的就是将 G 从栈里弹出,表示我们从 G 这里已经无法继续走下去了,看看能不能从前一个路口找到出路。

如果发现周围的顶点都被访问了,就把当前的顶点弹出。

第六步 现在栈的顶部记录的是顶点 E ,我们来看看与 E 相连的顶点中有没有还没被访问到的,发现它们都被访问了,所以把 E 也弹出去

第七步 当前栈的顶点是 B ,看看它周围有没有还没被访问的顶点,有,是顶点 F ,于是把 F 压入栈,标记它为访问过,并输出到结果中。

第八步  当前顶点是 F ,与 F 相连并且还未被访问到的点是 C D ,按照字母顺序来,下一个被访问的点是 C ,将 C 压入栈,标记为访问过,输出到结果中。

第九步 当前顶点为 C ,与 C 相连并尚未被访问到的顶点是 H ,将 H 压入栈,标记为访问过,输出到结果中。

第十步 当前顶点是 H,由于和它相连的点都被访问过了,将它弹出栈。

第十一步 当前顶点是 C ,与 C 相连的点都被访问过了,将 C 弹出栈。

 

第十二步 当前顶点是 F ,与 F 相连的并且尚未访问的点是 D ,将 D 压入栈,输出到结果中,并标记为访问过。

第十三步 当前顶点是 D ,与它相连的点都被访问过了,将它弹出栈。以此类推,顶点 F B A 的邻居都被访问过了,将它们依次弹出栈就好了。最后,当栈里已经没有顶点需要处理了,我们的整个遍历结束。

 

举报

相关推荐

0 条评论