dfs就是回溯法,用遞迴的方法是很自然的。那麼該如何遞迴呢?
簡單的說就是:1、如果當前節點沒有被搜尋過,那麼處理當前節點,並標記為搜尋過;如果當前節點已經被搜尋過,退出;
2、遞迴遍歷所有沒有被搜尋過的臨接節點。
注意,第一步的退出條件。遞迴必須有退出條件,否則會出現死迴圈。
對任意節點呼叫上述dfs函式,將搜尋到所有和該節點聯通的節點。
遞迴和棧總是聯絡在一起的,如果不採用遞迴,那麼就需要自己維護乙個棧。
1、從某節點開始,入棧;
2、當棧不為空時,迴圈3、4;當棧為空時,退出迴圈;
3、對棧頂節點處理,標記為搜尋過;注意,如果該節點的某個臨接節點處理完後,會回溯到該節點,注意不要重複處理該節點。
4、對棧頂節點,任意找乙個沒有搜尋過的臨接節點,入棧(注意只入棧乙個臨接節點,dfs就是找到一條路一直走下去,走不通了再回溯);如果發現該棧頂節點所有的臨接節點都被搜尋過,或者該節點沒有臨接節點,將該棧頂節點出棧。
下面是dfs的遞迴和非遞迴的**,c實現。為了簡單起見,搜尋物件為下圖所示的滿二叉樹,用陣列表示。
編譯執行結果:
可以看出結果是符合預期的。**中對左右子樹的處理,是對臨接節點處理的一種特殊情況。
非遞迴遍歷
1.先將a初始化為 false 標誌位 放入棧中 2.從棧中彈出 乙個元素,如果是fasle,將標誌改為true,再將 左右節點b f 初始化為false,3.按順序push到棧中,順序不同意味著 先 中 後序遍歷 4.再彈出乙個元素,判斷標準位,是 true直接輸出 5.再彈出元素 如果是null...
非遞迴dfs演算法
都說現今記憶體不值錢了,哈,也就不考慮空間複雜度的問題了,弄了倆輔助陣列,覺得解這題還是挺容易的,就是不知道有沒有bug。問題描述 假設圖g採用鄰接表儲存,編寫乙個實現連通圖g的深度優先遍歷 從頂點v出發 的非遞迴演算法。演算法思路 就是深度優先的思路。同樣是乙個visited陣列,標記已訪問過的頂...
非遞迴dfs演算法
都說現今記憶體不值錢了,哈,也就不考慮空間複雜度的問題了,弄了倆輔助陣列,覺得解這題還是挺容易的,就是不知道有沒有bug。問題描述 假設圖g採用鄰接表儲存,編寫乙個實現連通圖g的深度優先遍歷 從頂點v出發 的非遞迴演算法。演算法思路 就是深度優先的思路。同樣是乙個visited陣列,標記已訪問過的頂...