優先搜索(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