ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构----C++实现非递归和递归的深度优先遍历和广度优先遍历

2021-01-31 21:30:48  阅读:161  来源: 互联网

标签:25 优先 遍历 递归 INT MAX MaxSize MGraph int


 

 C++ 非递归深度优先遍历

#include <iostream>
#include <malloc.h>
#include <stack> 
using namespace std;
const int MaxSize=6;//图中最多顶点个数
typedef string DataType;
int visited[MaxSize] = {0};//全局数组变量visited初始化 
class MGraph{
	public:
		MGraph();//构造函数 
		~MGraph(); 
		void DFTraverse(int v);
		void BFTraverse(int v);
	private:
		DataType vertex[MaxSize] = {"v0", "v1", "v2", "v3", "v4", "v5"}; //存储顶点的一维数组 
		int edge[MaxSize][MaxSize] = {{0,34,46,INT_MAX,INT_MAX,19}, 
								{34,0,INT_MAX,INT_MAX,12,INT_MAX},
								{46,INT_MAX,0,17,INT_MAX,25},
								{INT_MAX,INT_MAX,17,0,38,25},
								{INT_MAX,12,INT_MAX,38,0,26},
								{19,INT_MAX,25,25,26,0}};  //邻接矩阵
		int vertexNum=MaxSize,edgeNum=MaxSize;
}; 

MGraph::MGraph(){
	
} 

MGraph::~MGraph(){

} 

void MGraph::DFTraverse(int v){//非递归深度优先遍历 
	stack<int> DF_stack;
	DF_stack.push(v);
	cout<<vertex[DF_stack.top()];
	visited[v]=1;
	for(int j=0;j<vertexNum;j++){
		if( visited[j] == 0 && (edge[v][j]!=INT_MAX && edge[v][j]!=0 )){
			cout<<vertex[j];
			visited[j]=1;
			v = j;
			DF_stack.push(j); 
			j=0;
		}
		if(j == vertexNum-1 ){
			DF_stack.pop();
		}
	}
}
int main(){
	int i;
	MGraph MG{};
	for(i=0;i<MaxSize;i++)
		visited[i]=0;
	cout<<"深度优先遍历序列是:"<<endl;
	MG.DFTraverse(0);
	cout<<endl;
}

实验结果图:

 

 C++ 递归深度优先遍历 

#include <iostream>
#include <malloc.h>
#include <stack> 
using namespace std;
const int MaxSize=6;//图中最多顶点个数
typedef string DataType;
int visited[MaxSize] = {0};//全局数组变量visited初始化 
class MGraph{
	public:
		MGraph();//构造函数 
		~MGraph(); 
		void DFTraverse(int v);
		void BFTraverse(int v);
	private:
		DataType vertex[MaxSize] = {"v0", "v1", "v2", "v3", "v4", "v5"}; //存储顶点的一维数组 
		int edge[MaxSize][MaxSize] = {{0,34,46,INT_MAX,INT_MAX,19}, 
								{34,0,INT_MAX,INT_MAX,12,INT_MAX},
								{46,INT_MAX,0,17,INT_MAX,25},
								{INT_MAX,INT_MAX,17,0,38,25},
								{INT_MAX,12,INT_MAX,38,0,26},
								{19,INT_MAX,25,25,26,0}};  //邻接矩阵
		int vertexNum=MaxSize,edgeNum=MaxSize;
}; 

MGraph::MGraph(){
	
} 

MGraph::~MGraph(){

} 
 
void MGraph::DFTraverse(int v){//深度优先遍历 
	cout<<vertex[v];
	visited[v]=1;
	for(int j=0;j<vertexNum;j++)
		if(visited[j] == 0 && (edge[v][j]!=INT_MAX && edge[v][j]!=0 ))
			DFTraverse(j);
}

int main(){
	int i;
	MGraph MG{};
	for(i=0;i<MaxSize;i++)
		visited[i]=0;
	cout<<"深度优先遍历序列是:"<<endl;
	MG.DFTraverse(0);
	cout<<endl;
}

实验结果图: 

 

C++广度优先遍历

#include <iostream>
#include <malloc.h>
#include <stack> 
using namespace std;
const int MaxSize=6;//图中最多顶点个数
typedef string DataType;
int visited[MaxSize] = {0};//全局数组变量visited初始化 
class MGraph{
	public:
		MGraph();//构造函数 
		~MGraph(); 
		void DFTraverse(int v);
		void BFTraverse(int v);
	private:
		DataType vertex[MaxSize] = {"v0", "v1", "v2", "v3", "v4", "v5"}; //存储顶点的一维数组 
		int edge[MaxSize][MaxSize] = {{0,34,46,INT_MAX,INT_MAX,19}, 
								{34,0,INT_MAX,INT_MAX,12,INT_MAX},
								{46,INT_MAX,0,17,INT_MAX,25},
								{INT_MAX,INT_MAX,17,0,38,25},
								{INT_MAX,12,INT_MAX,38,0,26},
								{19,INT_MAX,25,25,26,0}};  //邻接矩阵
		int vertexNum=MaxSize,edgeNum=MaxSize;
}; 

MGraph::MGraph(){
	
} 

MGraph::~MGraph(){

} 
 
void MGraph::BFTraverse(int v){//广度优先遍历 
	int w,j,Q[MaxSize];//采用顺序队列
	int front=-1,rear=-1;//初始化队列
	cout<<vertex[v];
	visited[v]=1;
	Q[++rear]=v;//被访问顶点入队
	while(front!=rear){
		w=Q[++front];//将队头元素出队并送到v中
		for(j=0;j<vertexNum;j++)
			if((edge[w][j]!=INT_MAX && edge[w][j]!=0 ) && visited[j] == 0){
				cout<<vertex[j];
				visited[j] = 1;
				Q[++rear] = j;
			} 
	} 
}

int main(){
	int i;
	MGraph MG{};
	for(i=0;i<MaxSize;i++)
		visited[i]=0;
	cout<<"广度优先遍历序列是:"<<endl;
	MG.BFTraverse(0);
}

实验结果图: 

我是热爱学习的呵呵哒~如果你觉得文章很棒,对你有帮助的话,可以点赞+收藏+加关注喔~

如果文章有不正确的地方,欢迎交流指正,我将虚心请教~o(>ω<)o

我会定期更新文章,继续为您提供优质文章

标签:25,优先,遍历,递归,INT,MAX,MaxSize,MGraph,int
来源: https://blog.csdn.net/weixin_41987016/article/details/113485016

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有