1.图的广度优先遍历
思路:
<1>定义一个队列,用于保存依次访问与其构成边的顶点.队列是先进先出的可以达到顶点遍历的有序,例如如下图:
![](https://img-my.csdn.net/uploads/201204/11/1334101113_1205.jpg)
![](https://img-my.csdn.net/uploads/201204/11/1334102679_2009.jpg)
<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;i<G->VertexNum;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;j<G->VertexNum;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;i<G->VertexNum;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;j<G->VertexNum;j++)
if(!G->IsTrav[j] && G->Vertex[k][j]!=MAXVALUE)
DFS(g,j);
}