資料結構----C++實現非遞迴和遞迴的深度優先遍歷和廣度優先遍歷
阿新 • • 發佈:2021-02-01
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
我會定期更新文章,繼續為您提供優質文章