课上通过数据结构知识,我们能够通过深度优先广度优先去遍历整个图结构。在实验中,friendship两次也均有涉猎,在java语言中实现图这种数据结构的使用同时体会,软件构造过程中的学习,经验和总结。在图中,进一步运用理解java软件构造的内容知识。
那么对于图这种结构,我们通过遍历的优先级,还可以分成贪心等算法,但其基础都为广度和深度优先,那么对于这两种结构都分别用到了栈和队列的概念,通过访问,即可以以这个序列来进行输出,其也为生成树。
但当他图并非联通时,便出现问题,可能会出现多个生成树,平常的广度深度优先便需要改良。
同时,还可以根据遍历的开始节点进行改进。
深度优先:(以c语言为例)for(i=0;iv=v%n; if(!visited[v]){ treenum++; printf("第%d棵树:",treenum); fprintf(f,"第%d棵树:",treenum); printf("%2d:%3c|",v+1,g.vex[v]);//输出顶点v fprintf(f,"%2d:%3c|",v+1,g.vex[v]); visited[v]=1;//被访问过 S[++top]=v;//顶点v进栈 while(top!=-1){ v=S[top];//栈顶元素 for(j=0;j if(visited[j]==0&&g.edge[v][j]==1)//没被访问过且存在边(v,j) { printf("%2d:%3c|",j+1,g.vex[j]);//输出顶点j fprintf(f,"%2d:%3c|",j+1,g.vex[j]); visited[j]=1; S[++top]=j; break; } } if(j==n) top--; } } }
其逻辑图展示为:
广度优先:(以c语言为例):
LinkQue q;
setQueue(&q);
for(i=0;i
v=v%n;
if(!visited[v]){
treenum++;
printf("第%d棵树:",treenum);
fprintf(f,"第%d棵树:",treenum);
enQueue(&q,v);
printf("%2d:%3c|",v+1,g.vex[v]);//输出顶点v
fprintf(f,"%2d:%3c|",v+1,g.vex[v]);
visited[v]=1;
while(q.front!=q.rear){
u=deQueue(&q);
for(j=0;j
if(visited[j]==0&&g.edge[u][j]==1)//没被访问过且存在边(u,j)
{
printf("%2d:%3c|",j+1,g.vex[j]);//输出顶点j
fprintf(f,"%2d:%3c|",j+1,g.vex[j]);
visited[j]=1;
enQueue(&q,j);
}
}
}
}
}
其逻辑图展示为:
结果:
图的遍历:(以1为遍历起点)
测试2:
结果:
即在原本的基础上进行改进,在过程外围在嵌套一个遍历所有点的循环,即可依次输出生成树。从而解决只能针对于连通图遍历点不一样,进而对于非连通图无法全部遍历的问题,同时还可以根据输入的开始节点进行遍历。



