JavaScript算法實例之求二叉樹從根到葉的所有路徑和
例如,考慮下面的二叉樹:
5
/ \
3 8
/ \ / \
1 4 7 9
5 -> 3 -> 1 為 531 5 -> 3 -> 4 為 534 5 -> 8 -> 7 為 587 5 -> 8 -> 9 為 589
這四個路徑的和為:531 + 534 + 587 + 589 = 2241。
為了解決這個問題,你可以使用深度優(yōu)先搜索 (DFS) 來遍歷每一條路徑,并在遍歷過程中累計路徑的和:
class TreeNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
function sumPaths(node, currentSum = 0) {
if (!node) return 0;
currentSum = currentSum * 10 + node.value;
// 如果是葉子節(jié)點,直接返回當前和
if (!node.left && !node.right) return currentSum;
// 否則返回左右子樹的和
return sumPaths(node.left, currentSum) + sumPaths(node.right, currentSum);
}
// 使用上面的樹作為示例
const root = new TreeNode(5);
root.left = new TreeNode(3);
root.right = new TreeNode(8);
root.left.left = new TreeNode(1);
root.left.right = new TreeNode(4);
root.right.left = new TreeNode(7);
root.right.right = new TreeNode(9);
console.log(sumPaths(root)); // 輸出: 2241
深度優(yōu)先搜索(Deep First Search,簡稱 DFS)是一種用于遍歷或搜索樹或圖的算法。在樹或圖上進行搜索的過程中,DFS 盡可能沿著分支深入到樹或圖的盡頭,然后再回溯至其他分支繼續(xù)探索,直到已經訪問過所有可能的路徑。
工作原理:
- 從起始節(jié)點開始。
- 探索盡可能深的分支。
- 如果當前節(jié)點沒有未探索的分支,則回溯。
- 探索下一個分支。
- 重復以上步驟,直到訪問所有的節(jié)點。
實現(xiàn):
DFS 可以通過遞歸或使用堆棧實現(xiàn)。
遞歸實現(xiàn):
在樹的情況下,可以遞歸地訪問每個節(jié)點的子節(jié)點。
function dfs(node) {
if (node == null) return;
console.log(node.value); // 處理當前節(jié)點
dfs(node.left); // 遞歸訪問左子節(jié)點
dfs(node.right); // 遞歸訪問右子節(jié)點
}
使用堆棧實現(xiàn):
堆??梢詭椭4娲L問的節(jié)點。一般在圖中使用堆棧實現(xiàn) DFS,因為圖可能含有循環(huán),需要一個額外的數據結構來跟蹤已訪問的節(jié)點。
function dfs(graph, start) {
let stack = [];
let visited = new Set();
stack.push(start);
while (stack.length) {
let node = stack.pop();
if (!visited.has(node)) {
console.log(node); // 處理當前節(jié)點
visited.add(node);
// 添加未訪問的鄰接節(jié)點到堆棧
for (let neighbor of graph[node]) {
if (!visited.has(neighbor)) {
stack.push(neighbor);
}
}
}
}
}
用途:
- 在圖中尋找路徑。
- 拓撲排序。
- 查找圖中的連通分量。
- 解決一些組合問題,如尋找所有可能的解決方案。
- 在某些情況下用于尋找最優(yōu)解。
注意:
在使用 DFS 時,需要注意避免重復訪問已經訪問過的節(jié)點,尤其是在圖中,因為圖可能包含循環(huán)。為此,可以使用一個集合或其他數據結構來跟蹤已訪問的節(jié)點。
以上就是JavaScript算法實例之求二叉樹從根到葉的所有路徑和的詳細內容,更多關于JavaScript求二叉樹所有路徑和的資料請關注腳本之家其它相關文章!
相關文章
Bootstrap modal只加載一次數據的解決辦法(推薦)
這篇文章主要介紹了Bootstrap modal只加載一次數據的解決辦法,以及bootstrap模態(tài)框的簡單使用,需要的朋友可以參考下2017-11-11
es6 for循環(huán)中l(wèi)et和var區(qū)別詳解
這篇文章主要介紹了es6 for循環(huán)中l(wèi)et和var區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
js去掉數組中undefined及空字符串、null兩種方法例子
這篇文章主要給大家介紹了關于js去掉數組中undefined及空字符串、null的兩種方法例子,文中還介紹了undefined與null之間的區(qū)別,通過代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04
JavaScript實現(xiàn)彈出子窗口并傳值給父窗口
這篇文章主要介紹了JavaScript實現(xiàn)彈出子窗口并傳值給父窗口,方法很簡單,這里推薦給大家,需要的朋友可以參考下2014-12-12
javascript 實現(xiàn)父窗口引用彈出窗口的值的腳本
javascript 實現(xiàn)父窗口引用彈出窗口的值的腳本...2007-08-08
BootstrapValidator驗證用戶名已存在(ajax)
這篇文章主要為大家詳細介紹了BootstrapValidator驗證用戶名已存在,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
TypeScript遍歷Array的方法(for,forEach,every)
本文主要介紹了TypeScript遍歷Array的方法(for,forEach,every),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
淺析在javascript中創(chuàng)建對象的各種模式
下面小編就為大家?guī)硪黄獪\析在javascript中創(chuàng)建對象的各種模式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05

