图的遍历:从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程称为图的遍历。
深度优先遍历(DFS)
从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。
对于非连通图,只需对它的连通分量分别进行深度优先遍历,即在先前一个顶点进行一次深度优先遍历后,若图中尚有顶点未被访问,则另选一个未被访问的顶点作为起始点,重复上述过程,直到所有顶点都被访问到为止。
上图中,从顶点A开始一直向右走,遇到访问过的顶点时退回,走右手第二条边,直至返回顶点A。
DFS其实就是一个递归过程,类似于一棵树的前序遍历。
邻接矩阵方式:
1 | typedef int Boolean; |
邻接表方式:
1 | void DFSTraverse (GraphAdjList GL) |
每个顶点都经过且仅经过一次DFS函数,因为只有该函数能设置visit数组值为TRUE
对于n个顶点e条边的图来说,邻接矩阵方式时间为O(n²),邻接表方式时间为O(n+e),故对于点多边少的稀疏图来说更适合用邻接表。
广度优先遍历(BFS)
原理:每当一个元素出队列,将与该顶点相邻接的所有顶点中未被访问的顶点加入队列,加入前进行打印等处理,类似于图的层序遍历。
邻接矩阵方式:
1 | void BFSTraverse (MGraph G) |
只有一个DeQuene函数可以出队列,因此所有顶点均经历过该函数下方的for循环,故时间复杂度为O(n²)。
邻接表方式:
1 | void BFSTraverse (GraphAdjList GL) |
时间复杂度为O(n+e)。
DFS与BFS相同方式的时间复杂度相同。
深度优化遍历更适合目标比较明确,以找到目标为主要目的的情况,广度优先遍历更适合在不断扩大遍历范围时找到相对最优解的情况。