1. 程式人生 > >二叉樹的深度優先遍歷(DFS)與廣度優先遍歷(BFS)

二叉樹的深度優先遍歷(DFS)與廣度優先遍歷(BFS)

最近在練習劍指offer上的題,討論區看到有人提到深度優先遍歷和廣度優先遍歷,就查了一點相關知識點。

深度優先遍歷(Depth First Search,簡稱DFS)又稱深度優先搜尋,遍歷的過程是 從某個頂點出發,首先訪問這個頂點,然後找出剛訪問這個結點的第一個未被訪問的鄰結點,然後再以此鄰結點為頂點,繼續找它的下一個新的頂點進行訪問,重複此步驟,直到所有結點都被訪問完為止。 廣度優先遍歷(Breadth First Search,簡稱BFS)又稱廣度優先搜尋,遍歷的過程是 從某個頂點出發,首先訪問這個頂點,然後找出這個結點的所有未被訪問的鄰接點,訪問完後再訪問這些結點中第一個鄰接點的所有結點,重複此方法,直到所有結點都被訪問完為止。

DFS: ABDFCGH BFS: ABCDFGH

廣度優先遍歷與深度優先遍歷的 區別 在於:廣度優先遍歷是以層為順序,將某一層上的所有節點都搜尋到了之後才向下一層搜尋;而深度優先遍歷是將某一條枝椏上的所有節點都搜尋到了之後,才轉向搜尋另一條枝椏上的所有節點。也即BFS從頂點的第一個鄰接點一直訪問下去再訪問頂點的第二個鄰接點;DFS從頂點開始訪問該頂點的所有鄰接點再依次向下,一層一層的訪問。

在實現方面:

參照:https://www.cnblogs.com/mswangblog/p/6587196.html

DFS  採用棧實現 。首先將根結點壓入棧,

如果棧不為空,而後出棧並輸出當前結點中值,而後先把右子樹壓入棧,再把左子樹壓入棧,再判斷棧是否為空,迴圈.....

步驟如下:

(1) 樹的根結點入棧

(2)判斷棧是否為空,不為空,則出棧,並輸出出棧樹結點的值

(3)出棧樹結點的右子樹入棧

(4)出棧樹結點的左子樹入棧

(5)迴圈回到(2)

BFS  採用佇列實現。

(1) 樹的根結點入隊

(2)判斷佇列是否為空,不為空,則出隊,並輸出出隊樹結點的值

(3)出隊樹結點的左子樹進入佇列

(4)出隊樹結點的右子樹進入佇列

(5)迴圈回到(2)