前面分享完图的概念和图的几种存储结构后,我们趁热打铁来看看图的遍历吧。图的遍历主要有两种方式——深度优先遍历(DFS)和广度优先遍历(BFS)。这其实是两种很重要的算法,如果你经常刷算法题,你会经常遇到它们。这两种算法的题目真的很多。以后的leetcode也会重点分享这类题目。好啦,下面重点来讲解这两种遍历算法吧
1.深度优先遍历(BFS):
从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。
基本实现方法:

在下图假设约定右手原则(用的比较多):在没有碰到重复顶点的情况下,分叉路口始终是向右手边走,每路过一个顶点就做一个记号。(大家有没有发现很想树的先序遍历)。这里深度优先遍历的结果是不唯一的。
如图:(注意是从上往下看的右边哦)

此图的访问次序是:ABCDEFGHI
用邻接矩阵这种存储结构来表示无向图的深度优先遍历需要引入一个visited数组,值为1表示被访问过,值为0表示没被访问过。从起点开始,从矩阵图中找1的结点,若它的visited值为0,就依次访问下去,为1时就退回上一个结点。

如果它的存储结构确定了,那它的遍历顺序也就定了,不会出现很多种情况了
算法实现:

深度遍历要根据图的稀疏或稠密来确定使用那种存储结构实现深度遍历,和前面一样,稠密图用邻接矩阵,稀疏图用邻接表。
非连通图的遍历就类似先遍历一个连通图,再遍历另一个连通图。
2.广度优先遍历(DFS):
从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0 有路径相通的顶点都被访问到。
用邻接表和循环队列以及visited数组来实现算法:首先访问v1,就把v1的下标放在队列中,然后R
指针向上移动一位。访问后v1下标出队,F指针也向上移动。再把表的右边如图的1,2放入队列中,R向上移动两位。再将v2,v3的邻接点依次入队,R指针也依次向上移动。注意将某节点的邻接点出队后,该结点就消失,为后面的结点出队创造空间,同时F指针向上移动一位。已访问过的结点的visited值为1.依次循环下去,直到全部顶点的visited值都为1.

算法实现:

注意,深度优先遍历的广度优先遍历的时间复杂度是一样的。
好啦,关于图的遍历两种算法的基本内容就到这啦,下期会分享一篇这两种算法具体的完整实现代码。
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.
&spm=1001.2101.3001.5002&articleId=124456622&d=1&t=3&u=b22e5b295c834a2d9774e3dafdc4a653)

被折叠的 条评论
为什么被折叠?



