其中深度遍歷利用遞歸函數(shù)
也可以用棧實(shí)現(xiàn)深度遍歷,我覺得可以用遞歸的地方就可以用棧的,兩種方法的運(yùn)行順序是一樣的,但棧的效率更高些
廣度遍歷利用隊(duì)列實(shí)現(xiàn)
在本程序中建立的圖如下:
共有9個頂點(diǎn),14條邊為:
98,95,81,75,65,63,60,51,43,42,30,21,20,10
所以程序中建立圖的數(shù)據(jù)為:
edges="988175656360514342
30212010";
createAMLGraph(G,10,13,edges);
運(yùn)行結(jié)果:
可以看出深度遍歷是沿著一條路探索到最深層,再回溯再換另一條路
而廣度遍歷利用隊(duì)列的先進(jìn)后出可以實(shí)現(xiàn)從里層開始一層一層的向外探索
以下是代碼:
分為三部分:隊(duì)列結(jié)構(gòu)、圖結(jié)構(gòu)(多重表)、深度廣度遍歷
圖結(jié)構(gòu):
// ----------------------- 圖-多重表結(jié)構(gòu)及函數(shù) --------------------------
// 邊結(jié)構(gòu)
typedef struct EBox{
int ivex,jvex;
struct EBox *ilink,*jlink;
int info;
}EBox;
// 頂點(diǎn)結(jié)構(gòu)
typedef struct VexBox{
int data;
EBox *firstedge;
}VexBox;
// 圖結(jié)構(gòu)
typedef struct{
VexBox adjlist[MAX_VERTEX_NUM];
int vexnum,edgenum;
}AMLGraph;
// 建立圖
void createAMLGraph(AMLGraph &G,int vexnum,int edgenum,char *edges){
int t,i,j;
EBox *p;
G.vexnum=vexnum;
G.edgenum=edgenum;
// initializtion
for(t=0;t
G.adjlist[t].firstedge=NULL;
}
// create edges
for(t=0;t
edges++;
j=int(*edges)-48;
edges++;
p=new EBox;
p->ivex=i;
p->ilink=G.adjlist[i].firstedge;
p->jvex=j;
p->jlink=G.adjlist[j].firstedge;
p->info=NULL;
G.adjlist[i].firstedge=G.adjlist[j].firstedge=p;
}
}
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |