深度优先遍历:
从根节点开始遍历,从左到右依次遍历,遍历时应先将一条分支上遍历完才进行下一轮遍历。
如图:
遍历顺序为:1 2 4 3 5
程序如下:
#include <stdio.h>
int book[101]; //用于标记是否已遍历过,未遍历则为值为0
int sum; //每标记一次加 1 ,直到sum等于需要遍历的顶点个数n为止
int n,e[101][101]; //数组e作为两顶点之间的标记,为1则两者之间有连线,0则代表两者之间无连线。
void dfs(int cur)
{
int i;
printf("%d",cur);
sum++; //记录标记次数
if(sum==n)
{
return; //sum=n,所有顶点标记完成,退出
}
for(i=1;i<=n;i++) //从根节点开始,依次遍历
{
if(e[cur][i]==1&&book[i]==0)
{
book[i]=1; //表示该点已遍历,标记为1
dfs(i); //递归调用,继续遍历下一个点
}
}
}
int main()
{
int i,j,m,a,b;
printf("请输入元素个数,以及输入连线次数m: ");
scanf("%d %d",&n,&m);
//初始化二维数组
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=9999999; //用9999999表示无穷大
}
}
//值为1表示两者之间有连线,属于同一个分支,可继续遍历
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b); //输入a b
e[a][b]=1;
e[b][a]=1; //无向图,两个方向都需设置为1
}
book[1]=1;
dfs(1); //调用遍历函数
getchar();
getchar();
return 0;
}
程序运行结果:
请输入元素个数n,以及连线次数m:
5 4
1 2
1 3
1 5
2 4
遍历输出结果:1 2 4 3 5
a,b输入顺序可忽略。
注:学习笔记引用于纪磊 《啊哈!算法》