1. 程式人生 > 其它 >資料結構----C++實現非遞迴和遞迴的深度優先遍歷和廣度優先遍歷

資料結構----C++實現非遞迴和遞迴的深度優先遍歷和廣度優先遍歷

技術標籤:資料結構C++資料結構演算法

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

我會定期更新文章,繼續為您提供優質文章