437. Path Sum III
You are given a binary tree in which each node contains an integer value.
Find the number of paths that sum to a given value.
The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).
The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.
Example:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
10
/ \
5 -3
/ \ \
3 2 11
/ \ \
3 -2 1
Return 3. The paths that sum to 8 are:
1. 5 -> 3
2. 5 -> 2 -> 1
3. -3 -> 11
- An interested prefix sum solution. for reference
Key: Remove current sum from the map when this substree is visited.
public int pathSum(TreeNode root, int sum) {
HashMap<Integer, Integer> preSum = new HashMap();
preSum.put(0,1);
return helper(root, 0, sum, preSum);
}
public int helper(TreeNode root, int currSum, int target, HashMap<Integer, Integer> preSum) {
if (root == null) {
return 0;
}
currSum += root.val;
int res = preSum.getOrDefault(currSum - target, 0);
preSum.put(currSum, preSum.getOrDefault(currSum, 0) + 1);
res += helper(root.left, currSum, target, preSum) + helper(root.right, currSum, target, preSum);
preSum.put(currSum, preSum.get(currSum) - 1);
return res;
}
// path sum of this tree
public int pathSum(TreeNode root, int sum) {
if(root == null) return 0;
return withRoot(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum);
}
// path sum of this tree must include the root
public int withRoot(TreeNode root, int sum) {
if(root == null) return 0;
return (root.val == sum ? 1 : 0) + withRoot(root.left, sum-root.val) + withRoot(root.right, sum-root.val);
}
- Return all sums with current root
int result = 0;
public int pathSum(TreeNode root, int sum) {
traverse(root, sum);
return result;
}
public ArrayList<Integer> traverse(TreeNode root, int sum) {
if(root == null) return new ArrayList<>();
ArrayList<Integer> left = traverse(root.left, sum);
ArrayList<Integer> right = traverse(root.right, sum);
ArrayList<Integer> total = new ArrayList<>();
total.addAll(left);
total.addAll(right);
for(int i = 0; i < total.size(); i++) {
total.set(i, total.get(i)+root.val);
if(total.get(i) == sum) result++;
}
total.add(root.val);
if(root.val == sum) result++;
return total;
}