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ù)探索,直到已經(jīng)訪問過所有可能的路徑。
工作原理:
- 從起始節(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),需要一個額外的數(shù)據(jù)結構來跟蹤已訪問的節(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 時,需要注意避免重復訪問已經(jīng)訪問過的節(jié)點,尤其是在圖中,因為圖可能包含循環(huán)。為此,可以使用一個集合或其他數(shù)據(jù)結構來跟蹤已訪問的節(jié)點。
以上就是JavaScript算法實例之求二叉樹從根到葉的所有路徑和的詳細內容,更多關于JavaScript求二叉樹所有路徑和的資料請關注腳本之家其它相關文章!
相關文章
Bootstrap modal只加載一次數(shù)據(jù)的解決辦法(推薦)
這篇文章主要介紹了Bootstrap modal只加載一次數(shù)據(jù)的解決辦法,以及bootstrap模態(tài)框的簡單使用,需要的朋友可以參考下2017-11-11es6 for循環(huán)中l(wèi)et和var區(qū)別詳解
這篇文章主要介紹了es6 for循環(huán)中l(wèi)et和var區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01js去掉數(shù)組中undefined及空字符串、null兩種方法例子
這篇文章主要給大家介紹了關于js去掉數(shù)組中undefined及空字符串、null的兩種方法例子,文中還介紹了undefined與null之間的區(qū)別,通過代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04JavaScript實現(xiàn)彈出子窗口并傳值給父窗口
這篇文章主要介紹了JavaScript實現(xiàn)彈出子窗口并傳值給父窗口,方法很簡單,這里推薦給大家,需要的朋友可以參考下2014-12-12javascript 實現(xiàn)父窗口引用彈出窗口的值的腳本
javascript 實現(xiàn)父窗口引用彈出窗口的值的腳本...2007-08-08BootstrapValidator驗證用戶名已存在(ajax)
這篇文章主要為大家詳細介紹了BootstrapValidator驗證用戶名已存在,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11TypeScript遍歷Array的方法(for,forEach,every)
本文主要介紹了TypeScript遍歷Array的方法(for,forEach,every),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06淺析在javascript中創(chuàng)建對象的各種模式
下面小編就為大家?guī)硪黄獪\析在javascript中創(chuàng)建對象的各種模式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05