---
# System prepended metadata

title: 0437. Path Sum III
tags: [Leetcode, FaceBook, Prefix Sum, Medium, Backtracking]

---

# 0437. Path Sum III
###### tags: `Leetcode` `FaceBook` `Medium` `Backtracking` `Prefix Sum`
Link: https://leetcode.com/problems/path-sum-iii/
## 思路
问题可以转换成：求解从原始起点（根节点）a到当前节点b的路径中， 有多少节点a满足sum[a...b]=targetSum，由于从原始节点到当前节点的路径唯一，因此是一个一维前缀和问题
由于只能统计向下的路径，但是树的遍历会同时搜索两个方向的子树，因此我们应当在搜索完以某个节点为根的左右子树后，回溯地将路经总和从哈希表中删除，防止统计到跨越两个方向的路径
## Code
```java=
class Solution {
    Map<Integer, Integer> map = new HashMap<>();
    int ans = 0;
    public int pathSum(TreeNode root, int targetSum) {
        map.put(0,1);
        dfs(root, targetSum, 0);
        return ans;
    }
    public void dfs(TreeNode root, int t, int prev){
        if(root == null) return;
        ans += map.getOrDefault(root.val+prev-t,0);
        map.put(root.val+prev, map.getOrDefault(root.val+prev,0)+1);
        dfs(root.left, t, root.val+prev);
        dfs(root.right, t, root.val+prev);
        map.put(root.val+prev, map.get(root.val+prev)-1);
    }
}
```