深度優先演算法
深度優先搜尋屬於圖演算法的一種,是乙個針對圖和樹的遍歷演算法,英文縮寫為dfs即depth first search。
過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。
常用的演算法模板
//深度優先搜尋dfs
class
solution
//符合終止條件或已訪問過該節點,退出
source[x]
[y]=
'0';
//對已訪問的節點進行標記,可以直接在原節點上修改,也可以使用乙個visited陣列進行標記..
....
//此處為對目標節點的操作,如賦值,讀取數等
dfs(source,x+
1,y)
;//遞迴搜尋下一次遍歷節點
dfs(source,x-
1,y);.
....
.}public
intresult
(char
source)}}
return res;
}}
二叉樹的最大深度
class
solution
public
void
dfs(treenode root,
int d)
}
對稱二叉樹注意之前寫這個題老是陷入乙個誤區給定乙個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
1/ \
2 2/ \ / \
3 4 4 3
就是 比較root節點的左右問題 就造成 問題的無解
這樣的**主要是對 對稱樹的條件提取的錯誤
public boolean issymmetric(treenode root)
正確的 映象樹實際上應該是
class
solution
public
boolean
dfs(treenode left,treenode right)
}
島嶼數量給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。
此外,你可以假設該網格的四條邊均被水包圍。
class
solution
}return nums;
}public
void
dfs(
char c[
],int i,
int j)
if(c[i]
[j]==
'0')
//不是島
return
;else
}}
查並集也可以解決 這個為題
這個演算法很有意思 查並集的江湖紛爭
驗證搜尋二叉樹** 實際上每次遍歷完 我們總是可以把當前節點的子樹的最大值提取出來
然後到達根 在和它比 到達右子樹時候 恰好 根中的最大值也已經賦給了min **
實際上該題就是中序遍歷然後 用乙個min變數時刻儲存著 樹中的最小值
搜尋二叉樹的中序遍歷就是乙個遞增的序列
class solution
public boolean mid(treenode root)
}
二叉樹的右檢視這題最容易想到的做法肯定的廣度遍歷了
但是感覺深度遍歷做這種題目好有意思
class
solution
private
void
dfs(treenode root,
int depth)
// 先訪問 當前節點,再遞迴地訪問 右子樹 和 左子樹。
//這個判斷真的是神了 ..........
if(depth == res.
size()
) depth++
;dfs
(root.right, depth)
;dfs
(root.left, depth);}
}
島的最大幾乎和島嶼數量是同樣的模板 就是多加了 乙個當前島嶼的面積的tmp變數
和nums表示的是最大島嶼
class
solution}}
return nums;
}public
void
dfs(
int c[
],int i,
int j)
if(c[i]
[j]==0)
//不是島
return
;else
}}
子集
class
solution
public
void
dfs(
int[
] nums,
int i, linkedlist
tmp, list
> res)
dfs(nums, i +
1, tmp, res)
; tmp.
removelast()
;}}public
boolean
baohan
(list tmp,
int i)
public
boolean
baohan2
(list
> tmp,list
s)//結果陣列和新要新增的陣列不能重複
return
false;}
}
被圍繞的區域題目中解釋說被包圍的區間不會存在於邊界上,所以我們會想到邊界上的 o 要特殊處理,只要把邊界上的 o 特殊處理了,那麼剩下的 o替換成 x 就可以了。
問題轉化為,如何尋找和邊界聯通的 o
class
solution}}
} system.out.
println
(arrays.
deeptostring
(board));
for(
int i =
0; i }public
void
dfs(
char
board,
int i,
int j)
}}
深度遍歷和廣度遍歷
圖的遍歷,所謂遍歷,即是對結點的訪問。乙個圖有那麼多個結點,如何遍歷這些結點,需要特定策略,一般有兩種訪問策略 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第乙個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第乙個鄰接結點。總...
深度優先遍歷
第一步 從開始節點查詢可達節點,如果有沒到過的可達節點則第二部,否則第三步 第二部 便利到下乙個可達節點,記錄下該節點已經到達節點 第三步 回到上一步的節點再從第一步開始 乙個節點對應他的可達節點用map表示,map的key和value分別是integer和list 用來存放key對應的節點 遍歷過...
深度優先遍歷
深度優先遍歷很容易列出所有可能 這裡我們分情況 標註幾個易錯的點 不重複組合 不重複組合 則表明 如果我們取k 3 取n1 n2 n3 則n1從1 9中任取 但n1需要排除n1 同理n3需要排除n1 n2 如下 public static void dfs3 int start,listnums,l...