路径总和-iii
Tips
题目
给定一个二叉树的根节点 root, 和一个整数 targetSum, 求该二叉树里节点值之和等于 targetSum 的路径的数目.
路径不需要从根节点开始, 也不需要在叶子节点结束, 但是路径方向必须是向下的(只能从父节点到子节点).
示例

输入: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出: 3
解释: 和为 8 的路径有三条
题解
这道题可以通过前缀和的思路思考. 即从根节点 root 到某个子节点 node, 一定是唯一的路径(你可以把这条路径的所有元素想象成一个数组), 那么题目就变成了: 在这个数组中, 存在某个区间的和为 targetSum. 显然这就变成了一个前缀和的问题.
我们可以用一个 HasMap, key 记录前缀和, value 记录达成该前缀和包括的节点的个数. 具体解释看代码注释:
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {number}
 */
var pathSum = function (root, targetSum) {
  const prefixSum = new Map()
  prefixSum.set(0, 1)
  let count = 0
  const dfs = (node, currentSum) => {
    if (!node) return
    currentSum += node.val
    if (prefixSum.has(currentSum - targetSum)) {
      count += prefixSum.get(currentSum - targetSum)
    }
    prefixSum.set(
      currentSum,
      prefixSum.has(currentSum) ? prefixSum.get(currentSum) + 1 : 1,
    ) // 回
    dfs(node.left, currentSum)
    dfs(node.right, currentSum)
    prefixSum.set(currentSum, prefixSum.get(currentSum) - 1) // 溯
  }
  dfs(root, 0)
  return count
}
- 时间复杂度: 
O(n) - 空间复杂度: 
O(n)