由于在复习数据结构的考试中见到过将中序遍历的递归形式改写为非递归形式的题目,我自己又试着改写了图中的两个经典的遍历算法
非递归实现DFS
void DFS(Graph *g,int v)
{
arcnode *p;//边链表头指针
int visited[g.Vnum],stack[g.Vnum],top=-1;
for(int i=0;i<g.Vnum;i++)
{
visited[i]=0;
}
visit(v); //访问结点v
top++;
stack[top]=v;
while(top!=-1)
{
v=stack[top];
top--;
p=g.addlist[v].firstarc;
while(p!=NULL&&visited[p->data]==1)
{
p=p->nextacr;
}
if(p==NULL) --top;
else
{
v=p->data;
visit(v);
visited[v]=1;
top++;
stack[top]=v;
}
}
}
队列实现BFS
void BFS(Graph g,int v)
{
arcnode *p;//边链表头指针
int visited[g.Vnum],stack[g.Vnum],top=-1;
for(int i=0;i<g.Vnum;i++)
{
visited[i]=0;
}
visit(v); //访问结点v
top++;
stack[top]=v;
while(top!=-1)
{
v=stack[top];
top--;
p=g.addlist[v].firstarc;
while(p!=NULL)
{
if(visited[p->data]==0)
{
v=p->data;
visit(v);
visited[v]=1;
top++;
stack[top]=v;
}
p=p->nextacr;
}
}
}