一、概念
图的遍历是树的遍历的扩展。图的遍历是指从某一顶点出来,访问图中所有顶点,且使每一顶点仅被访问一次。
与树的遍历不同的是,图的遍历需要处理两种特殊情况:
- 从某一顶点出发进行遍历时,可能访问不到所有其他顶点,比如非连通图;
- 有些图存在回路,必须保证遍历过程不能因为回路陷入死循环。
- 解决方法:设访问标志
两种常见的遍历方法:深度优先遍历和广度优先遍历
二、深度优先遍历
连通图的深度优先遍历的基本思想是:从图中指定顶点v出发,先访问该顶点;然后对v的所有邻接顶点wi依次检查,若wi未被访问,则以wi为新起点递归进行深度优先遍历
如右图,遍历结果为: ABECDFG
类似于树的先序遍历
连通图的深度优先遍历代码
Status DFS_M(MGraph G, int k, Status (*visit)(int)) {
int i;
if(ERROR == visit(k)) return ERROR; // 访问k顶点
G.tags[k] = VISITED;
for(i = FirstAdjVex_M(G, k); i >= 0; i = NextAdjVex_M(G, k, i)) {
if(UNVISITED == G.tags[i]) // 位序为i的邻接顶点未访问过
if(ERROR == DFS_M(G, i, visit)) return ERROR; // 对i递归深度遍历
}
return OK;
}
求第一个邻接顶点操作
int Fi