JavaScript算法实例之求二叉树从根到叶的所有路径和

 更新时间:2023年10月26日 09:49:30   作者:ysheep  
如果你希望求某一特定路径(例如从根到叶子)上数字的和,那么问题就转变为了“求二叉树从根到叶的所有路径和”,所以本文给大家介绍了如何使用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。

为了解决这个问题,你可以使用深度优先搜索 (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;

  // 如果是叶子节点,直接返回当前和
  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

深度优先搜索(Deep First Search,简称 DFS)是一种用于遍历或搜索树或图的算法。在树或图上进行搜索的过程中,DFS 尽可能沿着分支深入到树或图的尽头,然后再回溯至其他分支继续探索,直到已经访问过所有可能的路径。

工作原理:

  • 从起始节点开始。
  • 探索尽可能深的分支。
  • 如果当前节点没有未探索的分支,则回溯。
  • 探索下一个分支。
  • 重复以上步骤,直到访问所有的节点。

实现:

DFS 可以通过递归或使用堆栈实现。

递归实现:

在树的情况下,可以递归地访问每个节点的子节点。

function dfs(node) {
  if (node == null) return;

  console.log(node.value);  // 处理当前节点
  dfs(node.left);  // 递归访问左子节点
  dfs(node.right);  // 递归访问右子节点
}

使用堆栈实现:

堆栈可以帮助保存待访问的节点。一般在图中使用堆栈实现 DFS,因为图可能含有循环,需要一个额外的数据结构来跟踪已访问的节点。

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);  // 处理当前节点
      visited.add(node);

      // 添加未访问的邻接节点到堆栈
      for (let neighbor of graph[node]) {
        if (!visited.has(neighbor)) {
          stack.push(neighbor);
        }
      }
    }
  }
}

用途:

  • 在图中寻找路径。
  • 拓扑排序。
  • 查找图中的连通分量。
  • 解决一些组合问题,如寻找所有可能的解决方案。
  • 在某些情况下用于寻找最优解。

注意:

在使用 DFS 时,需要注意避免重复访问已经访问过的节点,尤其是在图中,因为图可能包含循环。为此,可以使用一个集合或其他数据结构来跟踪已访问的节点。

以上就是JavaScript算法实例之求二叉树从根到叶的所有路径和的详细内容,更多关于JavaScript求二叉树所有路径和的资料请关注脚本之家其它相关文章!

相关文章

  • javascript闭包的高级使用方法实例

    javascript闭包的高级使用方法实例

    这篇文章介绍了javascript闭包的高级使用方法实例,有需要的朋友可以参考一下
    2013-07-07
  • 轻松学习Javascript闭包

    轻松学习Javascript闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。这篇文章主要介绍了Javascript闭包,需要的朋友可以参考下
    2017-03-03
  • JS判断元素是否在可视区域技巧详解

    JS判断元素是否在可视区域技巧详解

    这篇文章主要为大家介绍了JS判断元素是否在可视区域技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 微信公众平台开发教程(五)详解自定义菜单

    微信公众平台开发教程(五)详解自定义菜单

    这篇文章主要介绍了微信公众平台开发教程(五)详解自定义菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • 如何基于javascript实现贪吃蛇游戏

    如何基于javascript实现贪吃蛇游戏

    这篇文章主要介绍了如何基于javascript实现贪吃蛇游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Javascript之高级数组API的使用实例

    Javascript之高级数组API的使用实例

    今天小编就为大家分享一篇关于Javascript之高级数组API的使用实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 微信小程序实现登录注册界面

    微信小程序实现登录注册界面

    这篇文章主要为大家详细介绍了微信小程序实现登录注册界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • JS实现的杨辉三角【帕斯卡三角形】算法示例

    JS实现的杨辉三角【帕斯卡三角形】算法示例

    这篇文章主要介绍了JS实现的杨辉三角【帕斯卡三角形】算法,结合实例形式分析了杨辉三角的原理及javascript实现杨辉三角的相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • qrcode生成二维码微信长按无法识别问题的解决

    qrcode生成二维码微信长按无法识别问题的解决

    这篇文章主要介绍了qrcode生成二维码微信长按无法识别问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • JS去除字符串最后的逗号实例分析【四种方法】

    JS去除字符串最后的逗号实例分析【四种方法】

    这篇文章主要介绍了JS去除字符串最后的逗号,结合实例形式分析了四种字符串遍历、截取的操作方法,需要的朋友可以参考下
    2019-06-06

最新评论