leetcode 裡面很大一部分題目都是屬於這個範圍,例如path sum用的就是遞迴+dfs,path sum2用的是遞迴+dfs+回溯
遞迴:就是出現這種情況的**: (或者說是用到了棧)
解答樹角度:在dfs遍歷一棵解答樹
優點:結構簡潔
缺點:效率低,可能棧溢位
遞迴的一般結構:
voidf()
//某種形式的呼叫
f();
}
回溯:遞迴的一種,或者說是通過遞迴這種**結構來實現回溯這個目的。回溯法可以被認為是乙個有過剪枝的dfs過程。
解答樹角度:帶回溯的dfs遍歷一棵解答樹
回溯的一般結構:
void
dfs(int 當前狀態)
for(i=
0;i//橫向遍歷解答樹所有子節點
恢復全域性變數
//回溯部分}}
bfs和dfs是相似。
bfs(顯式用佇列)
dfs(隱式用棧)(即遞迴)
當然,對於dfs,用遞迴可能會造成棧溢位,所以也可以更改為顯示棧。
bfs:典型例題:p101 對於二叉樹的層次遍歷,p108對於圖的走迷宮最短路徑
將(起始)首節點加入佇列: q.push(head);
標記首節點已經被訪問: isvisited[head]=
true;
以下自動反應:
while(!q.empty())
dfs:典型例題:p107黑白影象
void
dfs(int x, int y)
主迴圈:
for(
int i =
1; i <= n; i++)
for(
int j =
1; j <= n; j++)
if(!vis[i][j] && mat[i][j])
// 找到沒有訪問過的黑格
ref:
遞迴,回溯,DFS,BFS的理解和模板 摘
遞迴 就是出現這種情況的 或者說是用到了棧 解答樹角度 在dfs遍歷一棵解答樹 優點 結構簡潔 缺點 效率低,可能棧溢位 遞迴的一般結構 1 void f 67 某種形式的呼叫 8f 9 回溯 遞迴的一種,或者說是通過遞迴這種 結構來實現回溯這個目的。回溯法可以被認為是乙個有過剪枝的dfs過程。解答...
遞迴,回溯和DFS區別
遞迴是一種演算法結構,回溯是一種演算法思想 乙個遞迴就是在函式中呼叫函式本身來解決問題 回溯就是通過不同的嘗試來生成問題的解,有點類似於窮舉,但是和窮舉不同的是回溯會 剪枝 意思就是對已經知道錯誤的結果沒必要再列舉接下來的答案了,比如乙個有序數列1,2,3,4,5,我要找和為5的所有集合,從前往後搜...
遞迴 回溯和DFS的區別
剪枝的意思也就是說對已經知道錯誤的結果沒必要再列舉接下來的答案了,比如乙個有序數列1,2,3,4,5,我要找和為5的所有集合,從前往後搜尋我選了1,然後2,然後選3的時候發現和已經大於預期,那麼4,5肯定也不行,這就是一種對搜尋過程的優化。回溯搜尋是深度優先搜尋 dfs 的一種。對於某乙個搜尋樹來說...