廣度優先搜尋和深度優先搜尋

2021-07-04 18:30:18 字數 1416 閱讀 7637

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。

結構體定義

typedef char vertextype;

typedef int edgetype;

#define maxvex 100

#define infinite 65535

typedef struct

mgraph;

測試函式如下

mgraph graph;

graph.numvertexes = 9;

graph.numedges = 14;

graph.vexs[0] = 'a';

graph.vexs[1] = 'b';

graph.vexs[2] = 'c';

graph.vexs[3] = 'd';

graph.vexs[4] = 'e';

graph.vexs[5] = 'f';

graph.vexs[6] = 'g';

graph.vexs[7] = 'h';

graph.vexs[8] = 'i';

for (int i = 0;i用遞迴實現的**如下

int visited[maxvex];

void dfs(mgraph graph, int i)

{ printf("%c ",graph.vexs[i]);

visited[i]=1;

for (int j = 0;j同樣也可以使用棧來實現

void deepthfirstsearch_stack(mgraph graph)

{ for (int i = 0;istackdfs;

for (int i = 0; i而廣度優先搜尋可以使用佇列來實現

void breadthfirstsearch(mgraph graph)

{ for (int i = 0;iqueuebfs;

for (int i = 0;i執行結果如下圖

可以看到,二者**幾乎一毛一樣。區別在於dfs使用了棧,bfs使用的是佇列。其實結合dfs和bfs的特點也很好理解,從樹的角度思考,bfs希望先找到左右的子節點,希望按照這個順序來列印,所以就是先進先出,也就是佇列。而dfs則希望先順著某條線一直列印,希望後進的先列印出來,也就是棧。

注意,兩種dfs列印結果是不一樣的,但是都是dfs。

最後需要注意的是,用棧和佇列寫這兩個演算法時,列印的位置很重要,自己寫容易出錯,不知道是在visit[i]=1的時候就列印還是出佇列的時候列印。其實很簡單,我們利用的就是棧和佇列的特色,所以出棧和出佇列的時候列印就沒有問題了。

深度優先搜尋和廣度優先搜尋

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...

深度優先搜尋和廣度優先搜尋

定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...

深度優先搜尋和廣度優先搜尋

深度優先搜尋 可以用這個圖來很好的幫助我們理解dfs,dfs是一種列舉所有完整路徑來遍歷所有情況的搜尋方法,可以使用遞迴來很好的實現dfs,遞迴式可以理解為 解決的典型問題給定乙個序列,列舉這個序列的所有子串行,從中選擇乙個某方面最優的子串行。也可以簡化理解為列舉從n個整數中選擇k個數的所有方案 具...