深度優先遍歷(DFS)(轉)


優先搜索(DFS, Depth First Search)是一個針對圖和樹的遍歷算法。早在19世紀就被用於解決迷宮問題。

對於下面的樹而言,DFS方法首先從根節點1開始,其搜索節點順序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中優先選擇左分枝)。

 

DFS的實現方式相比於BFS應該說大同小異,只是把queue換成了stack而已,stack具有后進先出LIFO(Last Input First Output)的特性,

DFS的操作步驟如下:
1、把起始點放入stack;
2、重復下述3步驟,直到stack為空為止:

a、從stack中訪問棧頂的點;

b、找出與此點鄰接的且尚未遍歷的點,進行標記,然后全部放入stack中;

c、如果此點沒有尚未遍歷的鄰接點,則將此點從stack中彈出

下面結合一個圖(graph)的實例,說明DFS的工作過程和原理: 

(1)將起始節點1放入棧stack中,標記為已遍歷。

 

 

 

(2)從stack中訪問棧頂的節點1,找出與節點1鄰接的節點,有2,9兩個節點,我們可以選擇其中任何一個,選擇規則可以人為設定,這里假設按照節點數字順序由小到大選擇,選中的是2,標記為已遍歷,然后放入stack中。

 

(3)從stack中取出棧頂的節點2,找出與節點2鄰接的節點,有1,3,5三個節點,節點1已遍歷過,排除;3,5中按照預定的規則選中的是3,標記為已遍歷,然后放入stack中。

 

 

(4)從stack中取出棧頂的節點3,找出與節點3鄰接的節點,有2,4兩個節點,節點2已遍歷過,排除;選中的是節點4,標記為已遍歷,然后放入stack中。

 

 

(5)從stack中取出棧頂的節點4,找出與節點4鄰接的節點,有3,5,6三個節點,節點3已遍歷過,排除;選中的是節點5,標記為已遍歷,然后放入stack中。

 

 

(6)從stack中取出棧頂的節點5,找出與節點5鄰接的節點,有2,4兩個節點,節點2,4都已遍歷過,因此節點5沒有尚未遍歷的鄰接點,則將此點從stack中彈出。

 

 

(7)當前stack棧頂的節點是4,找出與節點4鄰接的節點,有3,5,6三個節點,節點3,5都已遍歷過,排除;選中的是節點6,標記為已遍歷,然后放入stack中。

 

 

(8)當前stack棧頂的節點是6,找出與節點6鄰接的節點,有4,7,8三個節點,4已遍歷,按照規則選中的是7,標記為已遍歷,然后放入stack中。

 

 

(9)當前stack棧頂的節點是7,找出與節點7鄰接的節點,只有節點6,已遍歷過,因此沒有尚未遍歷的鄰接點,將節點7從stack中彈出。

 

 

(10)當前stack棧頂的節點是6,找出與節點6鄰接的節點,有節點7,8,7已遍歷過,因此將節點8放入stack中。

 

 

(11)當前stack棧頂的節點是8,找出與節點8鄰接的節點,有節點1,6,9,1,6已遍歷過,因此將節點9放入stack中。

 

 

(12)當前stack棧頂的節點是9,沒有尚未遍歷的鄰接點,將節點9彈出,依次類推,棧中剩余節點8,6,4,3,2,1都沒有尚未遍歷的鄰接點,都將彈出,最后棧為空。

(13)DFS遍歷完成。
---------------------
作者:saltriver
來源:CSDN
原文:https://blog.csdn.net/saltriver/article/details/54429068
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 

應用連接:https://blog.csdn.net/raphealguo/article/details/7560918


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM