leetcode每天一题:【路径总和】(简单)

204 阅读2分钟

这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

提供一个二叉树,和一个目标整数值targetSum,需要你在二叉树中找到一条路径,从根节点到叶子节点,这条路径的加起来的总和为目标整数值。

如果找得到,则返回true,否则返回false

如果二叉树没有根节点,则返回false

用画图来举个例子

目标值:7 存在1->2->5的路径等于目标值,返回true

image.png

目标值:8, 不存在路径等于目标值,所以返回falseimage.png

思路分析

第一种方法

我们可以对二叉树进行遍历,然后针对每条路径(根节点到叶子节点)求和,如果发现等于目标值,则抛出异常,然后就会被外部的try-catch捕获到

然后 直接返回true即可。这样子可以中断后面的遍历了。

如果遍历结束后还是没有找到,则返回false即可。

主要是通过新建一个sum函数,参数有个num,统计当前路径的和。

如果发现当前节点是叶子节点,就判断当前的路径之和是否等于目标值,是则抛出异常。

如果当前节点不是叶子节点,则把num加上当前节点的val,代表当前的路径的和。

然后继续递归遍历下面的左边树和右边树,传入num

遍历结束后还是没有等于目标值,返回false即可。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {boolean}
 */
var hasPathSum = function (root, targetSum) {
  if (!root) return false
  try {
    function sum (root, num) {
      if (!root) return
      if (!root.left && !root.right) {
        if (num + root.val === targetSum) throw new Error()
      }
      num = num + root.val
      sum(root.left, num)
      sum(root.right, num)
    }
    sum(root, 0)
  } catch (error) {
    return true
  }
  return false
};

image.png

第二种方法

这个方法思路类似,也是判断当前节点如果是叶子节点去做处理,不过它是通过减法,目标值减去节点的val,如果减为0的时候,就代表找到目标值,返回true。

否则继续遍历节点的左边树和右边树,传入目标值减去当前节点的值,递归遍历。

最后如果减为0就返回true。否则就返回false。

代码如下:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {boolean}
 */
var hasPathSum = function (root, targetSum) {
  if (!root) return 0
  if (!root.left && !root.right) return targetSum - root.val === 0
  return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val)
};

image.png