题目

题目来源:力扣(LeetCode)

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。

叶子节点 是指没有子节点的节点。

思路分析

根据题意,我们从根节点开始,每经过一个节点,就让 targetSum 的值减去当前节点的值,然后再将相减后的 targetSum 传递给当前节点的左右子节点;

如果当前节点没有子节点,就要判断 targetSum 是否为 0,如果为 0,则证明至少存在一条符合题意的路径;

如果到达某个叶子节点时,targetSum 的值 为0,那么就存在符合题意的路径;
如果到达了某个叶子节点,targetSum 的值不为 0,则证明没有符合题意的路径;

我们用递归的方式来解决该问题:

  1. const hasPathSum = function (root, targetSum) {
  2. // 根节点不存在,直接返回false
  3. if (!root) return false;
  4. // 到达某个叶子节点时,判断 targetSum 与当前叶子节点的值是否相等,即 targetSum 与当前节点的值相减后是否为 0
  5. // 若为 0,则存在符合题意的路径
  6. // 若不为 0,则不存在符合题意的路径
  7. if (!root.left && !root.right) return targetSum === root.val;
  8. // 将 targetSum 的值与当前节点的值相减
  9. targetSum -= root.val;
  10. // 将相减后的 targetSum 传递给当前节点的左右子节点,继续递归遍历节点
  11. return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum);
  12. }