深度遍歷和廣度遍歷

2021-07-25 15:24:24 字數 900 閱讀 9878

圖的遍歷,所謂遍歷,即是對結點的訪問。乙個圖有那麼多個結點,如何遍歷這些結點,需要特定策略,一般有兩種訪問策略:

深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第乙個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第乙個鄰接結點。總結起來可以這樣說:每次都在訪問完當前結點後首先訪問當前結點的第乙個鄰接結點。

我們從這裡可以看到,這樣的訪問策略是優先往縱向挖掘深入,而不是對乙個結點的所有鄰接結點進行橫向訪問。

具體演算法表述如下:

訪問初始結點v,並標記結點v為已訪問。

查詢結點v的第乙個鄰接結點w。

若w存在,則繼續執行4,否則演算法結束。

若w未被訪問,對w進行深度優先遍歷遞迴(即把w當做另乙個v,然後進行步驟123)。

查詢結點v的w鄰接結點的下乙個鄰接結點,轉到步驟3。

例如下圖,其深度優先遍歷順序為1->2->4->8->5->3->6->7

類似於乙個分層搜尋的過程,廣度優先遍歷需要使用乙個佇列以保持訪問過的結點的順序,以便按這個順序來訪問這些結點的鄰接結點。

具體演算法表述如下:

訪問初始結點v並標記結點v為已訪問。

結點v入佇列

當佇列非空時,繼續執行,否則演算法結束。

出佇列,取得隊頭結點u。

查詢結點u的第乙個鄰接結點w。

若結點u的鄰接結點w不存在,則轉到步驟3;否則迴圈執行以下三個步驟:

1). 若結點w尚未被訪問,則訪問結點w並標記為已訪問。

2). 結點w入佇列

3). 查詢結點u的繼w鄰接結點後的下乙個鄰接結點w,轉到步驟6。

如下圖,其廣度優先演算法的遍歷順序為:1->2->3->4->5->6->7->8

深度遍歷和廣度遍歷(函式)

mgraph是鄰接矩陣儲存的圖,定義如下 define maxvertexnum 10 定義最大頂點數 typedef int vertex 用頂點下標表示頂點,為整型 typedef struct mgraph 用鄰接矩陣表示的圖的型別 裁判測試程式樣例 include stdio.h inclu...

XML的深度遍歷和廣度遍歷

深度遍歷 public void domdepthfirst xmlnode currentnode if currentnode.haschildnodes xmlnode node currentnode.firstchildnode while node null domdepthfirst ...

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

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