图的遍历

图主要有深度优先遍历(DFS)和广度优先遍历(BFS)。

1 深度优先遍历——DFS

  深度优先类似于树的先序遍历,从要访问的节点(0)出发,选取和它相邻的任何一个节点(3),访问之,再访问和3相邻的节点(4),访问之,直到访问到没有相邻节点的节点,比如4没有相邻节点了,那么就回溯一层,访问3的未被访问的邻接节点。如图所示。直到所有的顶点均被访问。

                            

  所以深度优先就需要我们递归地检查每个顶点。

  所用的图的存储结构是上一篇中讲的邻接表存储。

void DFS(AGraph *g,int v)
{
    Edge *p;
    visit[v]=1;
    printf("%d\n",v);
    p=g->adjlist[v].firstEdge;
    while(p!=NULL)
    {
        if(visit[p->adjvex]==0)
            DFS(g,p->adjvex);
        p=p->nextEdge;
    }
}

  visit数组记录当前是否被访问。

2 广度优先遍历——BFS

  广度优先遍历类似于树的层次遍历。以上图为例,首先访问节点0,访问和0邻接的所有节点(1、2、3),然后访问节点(1、2、3)的全部邻接节点,直到所有的节点被访问。

  所以,BFS就需要用到队列,初始时,将初始节点入队,访问队首节点,将所有和它邻接且未被访问过的节点访问并入队,顶点出队,循环上述操作,直到所有节点访问一遍(即队空)。

  总结就是——访问、所有邻接节点访问入队,出队,访问所有邻接节点入队……直到队空

  

 1 void BFS(AGraph *g,int v,int n)
 2 {
 3     Edge *p;
 4     int que[MAXSIZE];
 5     int fro=0;       //队首
 6     int rea=0;      //队尾
 7     printf("%d\n",v);
 8     visit[v]=1;
 9     rea = (rea+1)%n;
10     que[rea]=v;
11     int j;
12     while(fro!=rea)
13     {
14         fro=(fro+1)%n;
15         j=que[fro];
16         p=g->adjlist[j].firstEdge;
17         while(p!=NULL)
18         {
19             if(visit[p->adjvex]==0)
20             {
21                 printf("%d\n",p->adjvex);
22                 visit[p->adjvex]=1;
23                 rea=(rea+1)%n;
24                 que[rea]=p->adjvex;
25             }
26             p=p->nextEdge;
27         }
28     }
29 }

 

posted @ 2015-10-19 16:39  康小武  阅读(284)  评论(0编辑  收藏  举报