图的遍历可分为深度优先搜索和广度优先搜索。
深度优先遍历(Depth First Search)类似于树的先根遍历,是树的先根遍历的推广。核心思想是,先假设初始状态是图中所有顶点未曾被访问,则深度优先搜索图中的某个顶点V出发,然后依次从V的未被访问的邻接点出发深度优先遍历图,直到图中所有和V有路径相通的节点都被访问到,若此时力中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问为止。
深度优先遍历的伪代码实现如下:
Boolean Visited[MAX]; //访问标志数组
Status (* VisitFunc)(int v); //函数变量
void DFSTraverse(Graph G,Status(* Visit)(int v)){
//对图作深度优先遍历
VisitFunc =Visit;//使用全局变量VisitFunc,使DFS不必设函数指针参数
for(v=0;v<G.vexnum;++v) visited[v]=FALSE; //访问标志数组初始化
for(v=0;v<G.vexnum;++v)
if(!visited[w]) DFS(G,w); //对尚未访问的顶点调用DFS
}
void DFS(Graph G,int v){
//从第v个顶点出发递归地深度优先遍历图G。
visited[v]=TRUE;VisitFunc(v);//访问第V个顶点
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w])DFS(G,w);//对v的尚未访问的邻接顶点w递归调用DFS
}
广度优先搜索(Breadth First Search)遍历类似于树的按层次遍历过程。假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点先于”后被访问的邻接点“被访问,直至图中所有已被访问的顶点的邻接点都被访问到。
void BFSTraverse(Graph G,Status (* Visit)(int v)){
//接文度优先递归遍历图G。使用辅助队列Q和访问标志数组visited.
for(v=0;v<G.vexnum;++v) visited[v]=FALSE;
InitQueue(Q);
for(v=0;v<G.vexnum;++v)
if(!visited[v]){ //V尚未访问
visited[v]=TRUE; Visit(v);
EnQueue(Q,v); //V入队列
while(!QueueEmpty(Q) {
DeQueue(Q,u); //队头元素出队并置为u
for(w=FirstAdjVex(G,u); w>=0;w=NextAdjVex(G,u,w)) {
if(!Visited[w]) { //w为u的尚未访问的邻接顶点
Visited[w]=TRUE; Visit(w);
EnQueue(Q,W);
}//if
}//while
}//if
}//BFSTraverse