深度优先遍历
深度优先遍历就是从一个顶点开始,顺着一条边,依次访问连接着的顶点。直到顶点全部访问完毕结束。
操作思路:
1、用一个一维数组表示该点是否被访问(存储0和1,0代表没访问,1代表访问完了)。
2、利用递归的方法,输出该节点数据,修改一维数组(0变成1),for循环,
进行下一个节点,一直到全部访问完成(测试有没有访问的数组里都是1);
上代码
这是用邻接矩阵(静态存储)存的图的深度遍历
int visited[maxsize]; //定义一个一维数组,保存每个顶点是否被访问过
void DFSTraverse(int v){ //从顶点v开始
cout<<vertex[v];visited[v]=1; //输出顶点v的数据,v标记为访问过
for(int i=0;i<VertexNum;i++){ //for循环开始从0开始遍历,全部都会遍历一遍
if(visited[i]==0&&arc[v][i]==1) //满足该点是v的邻接点并且没被访问过
DFSTraverse(i); //访问该点,利用递归思想
}
}
下面是邻接表(动态存储)存的图的深度遍历
两者的遍历思想完全一致,仅仅是因为存储结构不同,而写法不同。
void DFSTraverse(int v){
cout<<adjlist[v].vertex;visited[v]=1;
p=adjlist[v].firstedge; //工作指针p,v的邻接点赋值给p
while(p){ //p不为空,执行循环
j=p->adjvex; //变量j保存p指针(邻接点)的下标
if(visited[j]==0)DFSTraverse(j); //已经是邻接点了,还需满足没访问过
p=p->next; //p指针移动到下一个邻接点。
}
}
广度优先遍历
广度优先遍历是围绕一个节点,访问该节点的一圈的所有邻接点,依次循环下去。
操作思路:
1.也需要一个visited数组
2.利用队列的结构,使访问的顶点入队,开始下一轮访问队中的顶点的邻接点时,该顶点出队。
上代码
邻接矩阵广度遍历
int visited[maxsize]
void BFSTraverse(int v){
int front=rear=-1;
int Q[maxsize]; //建立并初始化队列
cout<<vertex[v];visited[v]=1; //输出初始点的节点数据,并标记访问过
Q[++rear]=v; //将该点入队
while(front==rear){ //队列不空则循环
v=Q[++front]; //元素出队
for(int j=0;j<vertexNum;j++){ //for循环所有的节点
if(arc[v][j]==1&&visited[j]==0) //找出与该点邻接并且没被访问过的
cout<<vertex[j];visited[j]=1; //满足则输出,标记,入队
Q[++rear]=j;
}
}
}
void BFSTraverse(int v){
int front=rear=-1;
int Q[maxsize]; //建立并初始化队列
cout<<adjlist[v].vertex;visited[v]=1;
Q[++rear]=v;
while(front==rear){
v=Q[++front];
p=adjlist[v].firstedge; //p存v的邻接点
while(p){ //如果p不为空,即他还有邻接点
j=p->adjvex; //j为该邻接点的下标
if(visited[j]==0){ //已知是邻接点,还需未被访问过
cout<<aajlist[j].vertex;visited[j]=1;Q[++rear]=j;//满足则输出,标记,入队
}
p=p->next; //p后移,指向下一个邻接点
}
}
}