1. 程式人生 > >再來一篇深度優先遍歷/搜尋總結?

再來一篇深度優先遍歷/搜尋總結?

### 再來一篇深度優先遍歷/搜尋總結? **簡介**:深度優先搜尋演算法(Depth-First-Search, DFS),最初是一種用於遍歷或搜尋樹和圖的演算法,在`LeetCode`中很常見,雖然感覺不難,但是理解起來還是有點難度的。 簡要概括,深度優先的主要思想就是“不撞南牆不回頭”,“一條路走到黑”,如果遇到“牆”或者“無路可走”時再去走下一條路。 ### 思路 假如對樹進行遍歷,沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支,當達到邊際時回溯上一個節點再進行搜尋。如下圖的一個二叉樹。 ![](https://img2020.cnblogs.com/blog/2000220/202005/2000220-20200522172919911-1975932694.png) 首先給出這個二叉樹的深度優先遍歷的結果(假定先走左子樹):`1->2->4->5->3->6->7` ### 那是怎樣得到這樣的結果呢? 根據深度優先遍歷的概念:沿著這樹的某一分支向下遍歷到不能再深入為止,之後進行回溯再選定新的分支。 **定義節點** ```java class TreeNode{ int val; TreeNode left; TreeNode right; } ``` **遞迴的方式** 分別對左右子樹進行遞迴,一直到底才進行回溯。如果不瞭解遞迴可以參考我的部落格[你真的懂遞迴嗎?](https://www.cnblogs.com/codexwj/p/12900851.html)。 ```java class Solution{ public void depthOrderTraversalWithRecusive(TreeNode root){ if(root == null){ return; } System.out.print(root.val +"->"); depthOrderTraversalWithRecusive(root.left); depthOrderTraversalWithRecusive(root.right); } } ``` **迭代的方式** 上面實現了遞迴方式的深度優先遍歷,也可以利用棧把遞迴轉換為迭代的方式。 但是為了保證出棧的順序,需要先壓入右節點,再壓左節點。 ```java class Solution{ public void depthOrderTraversalWithoutRecusive(TreeNode root){ if(root == null) return;