(1)深度优先类似于前序遍历,广度优先类似于层序遍历

【1】深度优先遍历代码和图例

这是要遍历的图

alt

这是代码的逻辑实现图

alt

#include<bits/stdc++.h>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
#define MAXSIZE 100
struct Mat_Grph{
	VertexType vertex[MAXSIZE];//顶点
	EdgeType arc[MAXSIZE][MAXSIZE];//边
	int vertex_num;
	int edge_num; 
};
int visited[MAXSIZE];
void create_graph(Mat_Grph *G){
	G->vertex_num=9;
	G->edge_num=15;
	G->vertex[0]='A';
	G->vertex[1]='B';
	G->vertex[2]='C';
	G->vertex[3]='D';
	G->vertex[4]='E';
	G->vertex[5]='F';
	G->vertex[6]='G';
	G->vertex[7]='H';
	G->vertex[8]='I';
	for(int i=0;i<G->vertex_num;i++){
		for(int j=0;j<G->vertex_num;j++){
			G->arc[i][j]=0;
		}
	} 
	//A-B A-F
	G->arc[0][1]=1;
	G->arc[0][5]=1;
	//B-C B-G B-I
	G->arc[1][2]=1;
	G->arc[1][6]=1;
	G->arc[1][8]=1;
	//C-D C-I
	G->arc[2][3]=1;
	G->arc[2][8]=1;
	//D-E D-G D-H D-I
	G->arc[3][4]=1;
	G->arc[3][6]=1;
	G->arc[3][7]=1;
	G->arc[3][8]=1;
	//E-F E-H
	G->arc[4][5]=1;
	G->arc[4][7]=1;
	//F-G
	G->arc[5][6]=1;
	//G-H
	G->arc[6][7]=1;
	for(int i=0;i<G->vertex_num;i++){
		for(int j=0;j<G->vertex_num;j++){
			G->arc[j][i]=G->arc[i][j];
		}
	}
}
void dfs(Mat_Grph G,int i){
	visited[i]=1;
	cout<<G.vertex[i]<<endl;
	for(int j=0;j<G.vertex_num;j++)
	{
		if(G.arc[i][j]==1&&visited[j]==0){
			dfs(G,j);
		}
	}
}
int main()
{
	Mat_Grph G;
	create_graph(&G);//图的创建 
	for(int i=0;i<G.vertex_num;i++){
		visited[i]=0;
	}//顶点有没有被访问过 
	dfs(G,0);//A的下标 
}

【2】广度优先遍历

#include<bits/stdc++.h>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
#define MAXSIZE 100
struct Mat_Grph{
	VertexType vertex[MAXSIZE];
	EdgeType arc[MAXSIZE][MAXSIZE];
	int vertex_num;
	int edge_num; 
};
int visited[MAXSIZE];
int front=0;
int rear=0;
int queue1[MAXSIZE];
void create_graph(Mat_Grph *G){
	G->vertex_num=9;
	G->edge_num=15;
	G->vertex[0]='A';
	G->vertex[1]='B';
	G->vertex[2]='C';
	G->vertex[3]='D';
	G->vertex[4]='E';
	G->vertex[5]='F';
	G->vertex[6]='G';
	G->vertex[7]='H';
	G->vertex[8]='I';
	for(int i=0;i<G->vertex_num;i++){
		for(int j=0;j<G->vertex_num;j++){
			G->arc[i][j]=0;
		}
	} 
	//A-B A-F
	G->arc[0][1]=1;
	G->arc[0][5]=1;
	//B-C B-G B-I
	G->arc[1][2]=1;
	G->arc[1][6]=1;
	G->arc[1][8]=1;
	//C-D C-I
	G->arc[2][3]=1;
	G->arc[2][8]=1;
	//D-E D-G D-H D-I
	G->arc[3][4]=1;
	G->arc[3][6]=1;
	G->arc[3][7]=1;
	G->arc[3][8]=1;
	//E-F E-H
	G->arc[4][5]=1;
	G->arc[4][7]=1;
	//F-G
	G->arc[5][6]=1;
	//G-H
	G->arc[6][7]=1;
	for(int i=0;i<G->vertex_num;i++){
		for(int j=0;j<G->vertex_num;j++){
			G->arc[j][i]=G->arc[i][j];
		}
	}
}
void bfs(Mat_Grph G){
	int i=0;
	visited[i]=1;//A的顶点 
	cout<<G.vertex[i]<<endl;
	queue1[rear]=i;
	rear++;
	while(front!=rear){
	i=queue1[front];//出队 
	front++;
	for(int j=0;j<G.vertex_num;j++)
	{
		if(G.arc[i][j]==1&&visited[j]==0){
			visited[j]=1;
			cout<<G.vertex[j]<<endl;
			queue1[rear]=j;//入队 
			rear++;
		}
	}
	}
}
int main()
{
	Mat_Grph G;
	create_graph(&G);//图的创建 
	for(int i=0;i<G.vertex_num;i++){
		visited[i]=0;
	}//顶点有没有被访问过 
	bfs(G);//层序遍历 
}

(2)最小生成树