樹的遍歷 深度優先遍歷和廣度優先遍歷

2021-08-18 17:52:27 字數 4249 閱讀 2772

廣度優先遍歷,類似於樹的按層次遍歷。設圖g是連通的,且圖g的初態是所有頂點均未被訪問過。從圖g的任一頂點vi出發按廣度優先搜尋遍歷圖的步驟是:訪問vi後,依次訪問與vi鄰接的所有頂點w1,w2,w3......wn,再按w1,w2,w3......wn的順序訪問其中每個頂點的所有未被訪問的鄰接點,再按此順序,依次訪問它們所有未被訪問的鄰接點,以此類推,直到圖中所有頂點均被訪問過為止。

比如,以下面的圖為例(包括不連通的頂點):

圖中包括9個頂點,頂點序號為0~8,頂點資訊為依次為字元 'a' ~ ' i',其中頂點8不與其他頂點相連通。

利用遞迴形式的深度優先遍歷:

遍歷結果:0->1->3->7->4->5->2->6 ->8         輸出結果:a->b->d->h->e->f->c->g->i

利用非遞迴形式(棧)的深度優先遍歷:

遍歷結果:0->1->3->7->4->5->2->6 ->8         輸出結果:a->b->d->h->e->f->c->g->i

利用廣度優先遍歷(佇列):

遍歷結果:0->1->2->3->4->5->6->7 ->8         輸出結果:a->b->c->d->e->f->g->h->i

程式如下(有問題共同交流):

#include#include#include#define num 9

#define maxsize 15

using namespace std;

typedef struct graph

;typedef struct stack

;typedef struct queue

;//直接建立圖

void creategraph(graph * g);

//深度優先遍歷(遞迴形式)圖中所有連通頂點,列印頂點資訊

void dfs(graph* g, int i, int visit[num]);

//深度優先遍歷(遞迴形式)圖中剩餘其他頂點,列印頂點資訊

void finaldfs(graph* g, int visit[num]);

//建立棧

void createstack(stack *s);

//判斷棧是否為空

int emptystack(stack *s);

//將頂點序號入棧

void pushstack(stack *s, int k);

//出棧,取棧頂元素

int popstack(stack *s);

//利用棧,深度優先遍歷(非遞迴形式)圖中每個頂點

void dfs_stack(graph *g, int i, stack* s, int visit[num]);

//利用棧,深度優先遍歷(非遞迴形式)圖中所有頂點

void finaldfs_stack(graph *g, stack* s, int visit[num]);

//建立佇列

void createqueue(queue *q);

//判斷佇列是否為空

int emptyqueue(queue *q);

//入隊,將頂點序號入隊

void enqueue(queue *q, int e);

//出隊,將隊頭元素出隊

int dequeue(queue *q);

//利用佇列,廣度優先遍歷圖中和源點i相連通的所有頂點

void bfs_queue(graph *g, int i, queue* q, int visit[num]);

//利用佇列,廣度優先遍歷圖中所有頂點(包括不連通頂點)

void finalbfs_queue(graph *g, queue* q, int visit[num]);

int main()

; //利用深度優先搜尋遍歷(遞迴形式)

printf("深度優先遍歷(遞迴形式): ");

finaldfs(&g,visit);

printf("\n");

//利用深度優先遍歷(非遞迴形式:棧)

printf("深度優先遍歷(非遞迴形式 棧): ");

int visit1[num] = ;

stack s;

createstack(&s);

finaldfs_stack(&g, &s, visit1);

printf("\n");

//利用廣度優先遍歷(佇列)

printf("廣度優先遍歷(佇列): ");

int visit2[num] = ;

queue q;

createqueue(&q);

finalbfs_queue(&g, &q, visit2);

printf("\n");

return 0;

}//建立圖

void creategraph(struct graph * g)

//直接建立圖的鄰接矩陣

g->matrixs[0][1] = 1;

g->matrixs[0][2] = 1;

g->matrixs[1][0] = 1;

g->matrixs[1][3] = 1;

g->matrixs[1][4] = 1;

g->matrixs[2][0] = 1;

g->matrixs[2][5] = 1;

g->matrixs[2][6] = 1;

g->matrixs[3][1] = 1;

g->matrixs[3][7] = 1;

g->matrixs[4][1] = 1;

g->matrixs[4][7] = 1;

g->matrixs[5][2] = 1;

g->matrixs[5][7] = 1;

g->matrixs[6][2] = 1;

g->matrixs[6][7] = 1;

g->matrixs[7][3] = 1;

g->matrixs[7][4] = 1;

g->matrixs[7][5] = 1;

g->matrixs[7][6] = 1;

}//深度優先遍歷(遞迴形式)圖中所有聯通頂點,列印頂點資訊

void dfs(graph* g, int i, int visit[num]) }}

//深度優先遍歷(遞迴形式)圖中所有頂點,列印頂點資訊

void finaldfs(graph* g, int visit[num]) }}

//建立棧

void createstack(stack *s)

//判斷棧是否為空

int emptystack(stack *s)

//將頂點序號入棧

void pushstack(stack *s, int k)

else }

//出棧,取棧頂元素

int popstack(stack *s)

else }

//利用棧,深度優先遍歷(非遞迴形式)圖中每個頂點

void dfs_stack(graph *g, int i, stack* s, int visit[num])

} if (flag==0)

}}//利用棧,深度優先遍歷(非遞迴形式)圖中所有頂點

void finaldfs_stack(graph *g, stack* s, int visit[num]) }}

//建立佇列

void createqueue(queue *q)

//判斷佇列是否為空

int emptyqueue(queue *q)

//入隊,將頂點序號入隊

void enqueue(queue *q, int e)

else }

//出隊,將隊頭元素出隊

int dequeue(queue *q)

else }

//利用佇列,廣度優先遍歷圖中和源點i相連通的所有頂點

void bfs_queue(graph *g, int i, queue* q, int visit[num])

} }}//利用佇列,廣度優先遍歷圖中所有頂點(包括不連通頂點)

void finalbfs_queue(graph *g, queue* q, int visit[num])

}}

輸出結果如下:

深度優先遍歷 和 廣度優先遍歷

圖的廣度優先搜尋是樹的按層次遍歷的推廣,它的基本思想是 首先訪問初始點vi,並將其標記為已訪問過,接著訪問vi的所有未被訪問過的鄰接點 vi1,vi2,vi t,並均標記已訪問過,然後再按照vi1,vi2,vi t的次序,訪問每乙個頂點的所有未被訪問過的鄰接點,並均標記為已訪問過,依次類推,直到圖中...

廣度優先遍歷和深度優先遍歷

深度優先遍歷 廣度優先遍歷是圖的一種遍歷方式,它的思想就是遍歷這個點相鄰的所有的點,再對這些點進行廣度優先遍歷.如下圖所示 首先我們從a點開始遍歷,然後遍歷所有和a相鄰的點f和點g 然後對f和點g進行遍歷進行遍歷,得到點e,h,k和b 然後再繼續,知道所有的點都遍歷完成 首先,我們先定義圖graph...

廣度優先遍歷和深度優先遍歷

1.1 概念 以初始節點v0作為第一層節點,接著訪問它。然後迭代第一層節點即v0,訪問它相鄰接的沒有訪問過的節點比如v1,v2,v1,v2加入到第二層節點 迭代第二層節點v1,v2,v1,v2依次訪問相鄰接的沒有訪問過的節點,重複上述步驟直至所有節點都被訪問過為止。如圖所示首先訪問根節點v0,並將v...