再來一篇深度優先遍歷/搜尋總結?
阿新 • • 發佈:2020-05-22
### 再來一篇深度優先遍歷/搜尋總結?
**簡介**:深度優先搜尋演算法(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;