# 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); } } ```