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
ไปฃ็
Approach 1: DFS
path sum = ็ป่ฟroot่็น็sum path + ๅทฆ่พนroot.left่็น็sum path +ๅณ่พนroot.right่็นsum path
Time Complexity should be O(N^2) for the worst case and O(NlogN) for balanced binary Tree.
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */classSolution {publicintpathSum(TreeNode root,int sum) {if (root ==null) return0;// ไธญ + ๅทฆ + ๅณreturndfs(root, sum)+pathSum(root.left, sum)+pathSum(root.right, sum); }// ๅ ๅซๅฝๅ node ็ path sumprivateintdfs(TreeNode node,int sum) {if (node ==null) return0;return (node.val== sum ?1:0) +dfs(node.left, sum -node.val)+dfs(node.right, sum -node.val); }}
Approach #2 Prefix Sum + backtrace
classSolution {int count =0;int k;HashMap<Integer,Integer> h =newHashMap();publicintpathSum(TreeNode root,int sum) { k = sum;preorder(root,0);return count; }publicvoidpreorder(TreeNode node,int currSum) {if (node ==null)return;// current prefix sum currSum +=node.val;// here is the sum we're looking forif (currSum == k) count++;// number of times the curr_sum โ k has occured already, // determines the number of times a path with sum k // has occured upto the current node count +=h.getOrDefault(currSum - k,0);// add the current sum into hashmap// to use it during the child nodes processingh.put(currSum,h.getOrDefault(currSum,0) +1);// process left subtreepreorder(node.left, currSum);// process right subtreepreorder(node.right, currSum);// remove the current sum from the hashmap// in order not to use it during // the parallel subtree processingh.put(currSum,h.get(currSum) -1); } }