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