深度優先搜索(DFS, Depth First Search)是一個針對圖和樹的遍歷算法。早在19世紀就被用於解決迷宮問題。算法
對於下面的樹而言,DFS方法首先從根節點1開始,其搜索節點順序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中優先選擇左分枝)。
.net
DFS的實現方式相比於BFS應該說大同小異,只是把queue換成了stack而已,stack具備後進先出LIFO(Last Input First Output)的特性,DFS的操做步驟以下:
一、把起始點放入stack;
二、重複下述3步驟,直到stack爲空爲止:3d
下面結合一個圖(graph)的實例,說明DFS的工做過程和原理:
(1)將起始節點1放入棧stack中,標記爲已遍歷。
blog
(2)從stack中訪問棧頂的節點1,找出與節點1鄰接的節點,有2,9兩個節點,咱們能夠選擇其中任何一個,選擇規則能夠人爲設定,這裏假設按照節點數字順序由小到大選擇,選中的是2,標記爲已遍歷,而後放入stack中。
get
(3)從stack中取出棧頂的節點2,找出與節點2鄰接的節點,有1,3,5三個節點,節點1已遍歷過,排除;3,5中按照預約的規則選中的是3,標記爲已遍歷,而後放入stack中。
ast
(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中。
queue
(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遍歷完成。
點擊閱讀原文