寫不出來的深度優先搜尋----leetcode113 路徑總和
一道簡單的深度優先搜尋的題目:leetcode
給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
直接上程式碼,用程式碼來解釋
List<List<Integer>> res = new LinkedList<List<Integer>>(); // 全域性變數,記錄結果
Deque<Integer> path = new LinkedList<Integer>(); // 全域性變數,記錄路徑
public List<List<Integer>> pathSum(TreeNode root, int sum) {
dfs(root,sum);
return res;
}
private void dfs(TreeNode node, int sum){
if(node == null) return ; // 迴圈中止條件
path.offerLast(node.val); // 入隊
sum -= node.val;
// 如果是葉子結點,且總和等於 sum,記錄結果
if(node.left == null && node.right == null && sum == 0){
res.add(new LinkedList(path));
}
dfs(node.left, sum);
dfs(node.right, sum);
path.pollLast(); // 出隊
}
當然,這道題目也可以用廣度優先演算法來處理,有興趣可以試下,這裡直接給出官方題解
List<List<Integer>> ret = new LinkedList<List<Integer>>();
Map<TreeNode, TreeNode> map = new HashMap<TreeNode, TreeNode>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
if (root == null) {
return ret;
}
Queue<TreeNode> queueNode = new LinkedList<TreeNode>();
Queue<Integer> queueSum = new LinkedList<Integer>();
queueNode.offer(root);
queueSum.offer(0);
while (!queueNode.isEmpty()) {
TreeNode node = queueNode.poll();
int rec = queueSum.poll() + node.val;
if (node.left == null && node.right == null) {
if (rec == sum) {
getPath(node);
}
} else {
if (node.left != null) {
map.put(node.left, node);
queueNode.offer(node.left);
queueSum.offer(rec);
}
if (node.right != null) {
map.put(node.right, node);
queueNode.offer(node.right);
queueSum.offer(rec);
}
}
}
return ret;
}
public void getPath(TreeNode node) {
List<Integer> temp = new LinkedList<Integer>();
while (node != null) {
temp.add(node.val);
node = map.get(node);
}
Collections.reverse(temp);
ret.add(new LinkedList<Integer>(temp));
}
程式碼不難理解,但理解是一回事,能寫出來,是另外一回事
相關文章
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- 深度優先搜尋
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- DFS(深度優先搜尋)
- ybtoj:深度優先搜尋
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- 圖的遍歷:深度優先搜尋與廣度優先搜尋
- 再來一篇深度優先遍歷/搜尋總結?
- 共享庫連結和載入時的路徑搜尋優先順序
- 深度和廣度優先搜尋演算法演算法
- 【演算法】深度優先搜尋(DFS)演算法
- leetcode 刷題之深度優先搜尋LeetCode
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- Linux執行時動態庫搜尋路徑優先順序Linux
- 從1到n的全排列(深度優先搜尋)
- 深度優先搜尋演算法(DFS)講解演算法
- 【知識點】深度優先搜尋 Depth First Search
- 深度優先搜尋演算法-dfs講解演算法
- 深度優先搜尋 (Depth First Search 簡稱:DFS)
- 執行期載入時共享庫路徑搜尋優先順序實驗
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 深度優先搜尋(DFS)思路及演算法分析演算法
- Python 圖_系列之基於鄰接炬陣實現廣度、深度優先路徑搜尋演算法Python演算法
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 編譯期連結時共享庫搜尋路徑優先順序實驗編譯
- 小白的深度優先搜尋(Depth First Search)學習日記(Python)Python
- bfs廣度優先搜尋
- ybtoj:廣度優先搜尋
- 學習資料結構 - 深度優先搜尋 DFS 記錄資料結構
- c++ 廣度優先搜尋(寬搜)C++
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- js版本的(廣、深)度優先搜尋JS
- 二分搜尋樹系列之[ 深度優先-層序遍歷 (ergodic) ]Go
- 二分搜尋樹系列之「深度優先-層序遍歷 (ergodic) 」Go
- 最佳路徑搜尋(二):啟發式搜尋(代價一致搜尋(Dijkstra search),貪心搜尋,A*搜尋)
- Pots POJ – 3414 (搜尋+記錄路徑)
- Nginx的location規則:優先順序和路徑替換Nginx
- 遞迴——深度優先搜尋(DFS)——以滑雪問題為例(自頂而下)遞迴