112. Path Sum

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

Note: A leaf is a node with no children.

Example:

Given the below binary tree and sum = 22,

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

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

Analyze

使用递归的思路进行解题:

/**
 * 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
  return ifHasPathSum(root, sum)
}

var ifHasPathSum = function(node, sum) {
  if (!node && sum !== 0) return false
  if (!node && sum === 0) return true
  const remainingVal = sum - node.val
  const leftResult = ifHasPathSum(node.left, remainingVal)
  if (leftResult) return true
  const rightResult = ifHasPathSum(node.right, remainingVal)
  if (rightResult) return true
  return false
}

此时 ac, 卡在了以下测试用例中(此题的难点在于对递归终止条件的判断)

    1
  /   \
null   2

先对代码进行整理精简:

/**
 * 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
  return ifHasPathSum(root, sum)
}

var ifHasPathSum = function(node, sum) {
  if (!node) return sum === 0
  const remainingVal = sum - node.val
  return ifHasPathSum(node.left, remainingVal) || ifHasPathSum(node.right, remainingVal)
}

终止条件应由判断当前节点为空而且 sum === 0调整为判断当前节点为叶子节点且 node.val === sum, 再次修正代码

/**
 * 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 root.val === sum
  const remainingVal = sum - root.val
  return hasPathSum(root.left, remainingVal) || hasPathSum(root.right, remainingVal)
}