四、題目
二叉樹的題型中有很大一部分是用dfs解決,下面是二叉樹題型的歸納:
使用dfs,在乙個集合中得到所有滿足條件的排列或者組合。模版如下:
public list
main
(array arr)
private
void
getcombination
(array arr,
int startindex,
list comb,
list
combs)
}private
void
getpermutation
(array arr,
array visited,
list permu,
list
permus)
//每次從頭到尾挑選乙個沒被選過的元素(用visited來記錄是否被選過)
for(
int i =
0; i < nums.length; i++
)/* 如果有重複元素
if (i > 0 && nums[i] == nums[i - 1] && visited[i - 1] == 0)
*/comb.
add(nums[i]);
visited[i]
=true
;dfs
(arr, i +
1, permu, permus)
; visited[i]
=false
; comb.
remove
(nums[i]);
}}
如果有重複元素怎麼辦?
比如求abb的組合,答案為[, [a] [b], [a, b], [b, b], [a, b, b]]
如果使用以上模版,會得到答案[, [a], [b], [b], [a, b], [a, b], [b, b], [a, b, b]]
問題在於b被選擇了兩次,所以要多加乙個條件來避免重複選擇。
模版如下,只有很小的改動:
//如果集合中有重複元素,需要在dfs的過程中加入一些判斷條件。
private
void
getcombinationdup
(array arr,
int startindex,
array visited,
list comb,
list
combs)
comb.
add(nums[i]);
visited[i]
=true
;dfs
(arr, i +
1, comb, combs)
; visited[i]
=false
; comb.
remove
(nums[i]);
}}private
void
getpermutation
(array arr,
array visited,
list permu,
list
permus)
for(
int i =
0; i < nums.length; i++)if
(i >
0&& nums[i]
== nums[i -1]
&& visited[i -1]
==0) comb.
add(nums[i]);
visited[i]
=true
;dfs
(arr, i +
1, permu, permus)
; visited[i]
=false
; comb.
remove
(nums[i]);
}}
這是深度優先搜尋中變化最多的題目,偏難。
題目一般會給出乙個矩陣,然後在矩陣中使用dfs。此外,也有的題並沒有給出矩陣,需要靠自己抽象出乙個圖在使用dfs。
這個型別的題沒有模版,需要靠不斷練習找解題思路。
深度優先搜尋演算法
include include define vertexnum 9 struct node typedef struct node graph struct node head vertexnum 定義圖形結構 int visited vertexnum 頂點陣列 深度優先搜尋 void dfs ...
深度優先搜尋演算法
今天我們來複習一下萬能的搜尋演算法之深度優先搜尋演算法。深度優先搜尋演算法顧名思義就是按照樹的延伸不停的往下搜尋,直到樹的盡頭之後再一步一步的回溯回來。好吧,我們直接問你乙個問題,給你乙個數n,讓你輸出從1到這個樹的全排列,你會怎麼寫,會不會想到去用若干個for迴圈?好吧,你肯定錯了,其實他考的就是...
深度優先搜尋演算法
1.深度優先搜尋演算法的概念 深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個 節點只能訪問一次。如下例 該圖為乙個無向圖,假設我們從a開始進行深度優先搜尋,第二點可以是b c d中任意乙個,...