图的两种遍历方式--深度与广度优先遍历

     1.图的广度优先遍历
           思路:
                 <1>定义一个队列,用于保存依次访问与其构成边的顶点.队列是先进先出的可以达到顶点遍历的有序,例如如下图:

         保存队列
          <2>然后依次循环,顺序的处理每一个顶点,输出顶点的要求是这两个顶点可以构成边。其没有被访问过即IsTrav==0;
      
定义队列:Queue Q; 进队函数: QueueIn(G *g,int i):
  出队函数:QueueOut(G *g,int i);  判空:IsEmpty(G* g);
伪代码:
  G g;   int i,j,k;
  for(i=0;iVertexNum;i++)
      if(!G->IsTrav[i])
         {
           G->IsTrav[i]=1;       //当前顶点被访问,标记为已访问
           QueueIn(&g,i);         
           printf(g.Vertex[i]);
           while(!IsEmpty(g))      //依次处理和当前顶点构成边的顶点
           {
                QueueOut(&g,&k);
                for(j=0;jVertexNum;j++)
                    if(!G->IsTrav[j] && G->Vertex[k][j]!=MAXVALUE)
                         {
                             printf(g.Vertex[j]);
                             QueueIn(&g,j);
                             g.IsTrav[j]=1;
                         }
              }
           } 
   2.深度优先遍历
        思路:
           <1>深度优先遍历用到了递归的方法
           <2>依次循环访问每一个顶点
           <3>递归时,将访问到的顶点标记为已访问IsTrav[i]=1;并输出
      为代码:
           
  G g;   int i,j,k;
  for(i=0;iVertexNum;i++)
      if(!G->IsTrav[i])
             DFS(&g,i);

int DFS(G *g,int i)
{
      int j;
      G->IsTrav[i]=1;  
      printf(g.Vertex[i]);
      for(j=0;jVertexNum;j++)
      if(!G->IsTrav[j] && G->Vertex[k][j]!=MAXVALUE)
                            DFS(g,j);
}
            
 
               

你可能感兴趣的:(【算法】)