图的遍历——深度和广度

深度优先遍历

深度优先遍历就是从一个顶点开始,顺着一条边,依次访问连接着的顶点。直到顶点全部访问完毕结束。
操作思路:
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后移,指向下一个邻接点
		}	
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值