leetcode 算法题112 (简单028) 路径总和

leetcode 算法题112 (简单028) 路径总和

  • 题目介绍
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
  • 示例

给定如下二叉树,以及目标和 sum = 22 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

             5
            / \
           4   8
          /   / \
         11  13  4
        /  \      \
       7    2      1
  • 解法一
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {boolean}
 */
var hasPathSum = function(root, sum) {
  if(!root) {
    return false;
  }
  if(root.left && root.right) {
    return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
  }
  if(!(root.left || root.right)) {
    return root.val === sum;
  }
  return hasPathSum(root.left || root.right, sum - root.val);
};

执行用时 : 92ms, 在所有 JavaScript 提交中击败了82.09%的用户

内存消耗 : 36.8MB, 在所有 JavaScript 提交中击败了86.21%的用户

  • 解法一
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {boolean}
 */
var hasPathSum = function(root, sum) {
  if (!root) {
    return false;
  }
  if (root.left && root.right) {
    return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
  }
  if (!(root.left || root.right)) {
    return root.val === sum;
  }
  return hasPathSum(root.left || root.right, sum - root.val);
};

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {boolean}
 */
var hasPathSum = function(root, sum) {
  if(!root) {
    return false;
  }
  let sums = [];
  getSums(root, 0, sums);
  return sums.indexOf(sum) > -1;
};
const getSums = (node, num, sums) => {
  num += node.val;
  if(node.left && node.right) {
    getSums(node.left, num, sums);
    getSums(node.right, num, sums);
    return;
  }
  if(node.left || node.right) {
    getSums(node.left || node.right, num, sums);
    return;
  }
  sums.push(num);
  return;
}

执行用时 : 96ms, 在所有 JavaScript 提交中击败了69.42%的用户

内存消耗 : 36.9MB, 在所有 JavaScript 提交中击败了86.21%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值