返回

深入浅出:JavaScript版剑指Offer——二叉树中和为某一值的路径

前端


前言

对于前端开发者来说,掌握算法和数据结构的知识是十分重要的。剑指Offer作为一本经典的算法题集,备受广大程序员的推崇。本文将使用JavaScript来解决其中一道经典题目——二叉树中和为某一值的路径。

题目

给定一棵二叉树和一个目标值,找到所有从根节点到叶子节点的路径,使得路径上的节点值之和等于目标值。

解题思路

这道题属于二叉树的深度优先遍历。首先我们要了解DFS的遍历过程:

  1. 从根节点开始遍历。
  2. 访问当前节点。
  3. 访问当前节点的左子节点。
  4. 访问当前节点的右子节点。

当root节点走到null的时候,说明该条路径已经遍历完毕。

当一条路径上的节点值之和等于目标值时,我们就把这条路径记录下来。

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {number[][]}
 */
const pathSum = (root, targetSum) => {
  const result = [];
  const path = [];

  const dfs = (root, sum) => {
    if (root === null) {
      return;
    }

    path.push(root.val);
    sum += root.val;

    if (root.left === null && root.right === null && sum === targetSum) {
      result.push(path.slice());
    }

    dfs(root.left, sum);
    dfs(root.right, sum);

    path.pop();
    sum -= root.val;
  };

  dfs(root, 0);

  return result;
};

实例解析

我们来看一个具体的例子。给定一颗二叉树:

        5
      / \
     4   8
    /   / \
   11  13  4
  /  \    / \
 7    2  5   1

目标值为22。

使用上述代码进行求解,可以得到以下结果:

[[5, 4, 11, 2], [5, 8, 4, 5]]

这两个路径上的节点值之和都等于目标值22。

总结

这篇文章详细介绍了如何使用JavaScript解决剑指Offer中的二叉树中和为某一值的路径问题。我们从题目的入手,分析了解题思路,并给出了详细的代码实现。最后,我们还通过一个实例来演示了代码的使用方法。