Given a binary tree and an integer k, determine the number of downward-only paths where the sum of the node values in the path equals k. A path can start and end at any node within the tree but must always move downward (from parent to child).
Examples:
Input: k = 7
Output: 3 Explanation: The following paths sum to k
Input: k = 3
Output: 2 Explanation: Path 1 : 1 -> 2 (Sum = 3) Path 2 : 3 (Sum = 3)

Constraints:
- 1 ≤ number of nodes ≤ 104
- -100 ≤ node value ≤ 100
- -109 ≤ k ≤ 109
Approach 01:
-
C++
-
Python
#include <unordered_map>
using namespace std;
class Solution {
public:
void solve(Node* node, int currentSum, int targetSum, unordered_map<int, int> &prefixSumMap, int &pathCount) {
if (!node)
return;
currentSum += node->data;
if (currentSum == targetSum)
pathCount++;
pathCount += prefixSumMap[currentSum - targetSum];
prefixSumMap[currentSum]++;
solve(node->left, currentSum, targetSum, prefixSumMap, pathCount);
solve(node->right, currentSum, targetSum, prefixSumMap, pathCount);
prefixSumMap[currentSum]--; // Backtrack
}
int sumK(Node* root, int targetSum) {
int pathCount = 0;
unordered_map<int, int> prefixSumMap;
solve(root, 0, targetSum, prefixSumMap, pathCount);
return pathCount;
}
};
from collections import defaultdict
class Solution:
def solve(self, node, currentSum, targetSum, prefixSumMap, pathCount):
if not node:
return
currentSum += node.data
if currentSum == targetSum:
pathCount[0] += 1
pathCount[0] += prefixSumMap[currentSum - targetSum]
prefixSumMap[currentSum] += 1
self.solve(node.left, currentSum, targetSum, prefixSumMap, pathCount)
self.solve(node.right, currentSum, targetSum, prefixSumMap, pathCount)
prefixSumMap[currentSum] -= 1
def sumK(self, root, targetSum):
pathCount = [0]
prefixSumMap = defaultdict(int)
self.solve(root, 0, targetSum, prefixSumMap, pathCount)
return pathCount[0]
Time Complexity:
- Tree Traversal:
Each node is visited once, leading to a complexity of \( O(N) \), where \( N \) is the number of nodes in the tree.
- Prefix Sum Operations:
Each node performs constant-time operations (\( O(1) \)) involving the prefix sum map.
- Overall Time Complexity:
\( O(N) \), since each node is processed in constant time.
Space Complexity:
- Recursive Stack:
In the worst case (skewed tree), the recursion depth is \( O(N) \), while in a balanced tree, it is \( O(\log N) \).
- Prefix Sum Map:
In the worst case, the map stores a sum for each node, taking \( O(N) \) space.
- Overall Space Complexity:
Worst case: \( O(N) \), Best case (balanced tree): \( O(\log N) \).


