Algorithm
Problem Name: 437. Path Sum III
Given the root
of a binary tree and an integer targetSum
, return the number of paths where the sum of the values along the path equals targetSum
.
The path does not need to start or end at the root or a leaf, but it must go downwards (i.e., traveling only from parent nodes to child nodes).
Example 1:
Input: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 Output: 3 Explanation: The paths that sum to 8 are shown.
Example 2:
Input: root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 Output: 3
Constraints:
- The number of nodes in the tree is in the range
[0, 1000]
. -109 <= Node.val <= 109
-1000 <= targetSum <= 1000
Code Examples
#1 Code Example with C Programming
Code -
C Programming
int sumFrom(struct TreeNode *node, int sum) {
int n = 0;
if (node) {
sum -= node->val;
n += (!sum) ? 1 : 0;
n += sumFrom(node->left, sum);
n += sumFrom(node->right, sum);
}
return n;
}
int pathSum(struct TreeNode* root, int sum) {
if (!root) return 0;
return sumFrom(root, sum) +
pathSum(root->left, sum) +
pathSum(root->right, sum);
}
Copy The Code &
Try With Live Editor
Input
Output
#2 Code Example with Java Programming
Code -
Java Programming
class Solution {
public int pathSum(TreeNode root, int targetSum) {
Map map = new HashMap<>();
map.put(0L, 1);
int[] count = {0};
preorder(root, 0L, map, count, targetSum);
return count[0];
}
private void preorder(TreeNode root, long currSum, Map < Long, Integer> map, int[] count, int targetSum) {
if (root == null) {
return;
}
currSum += root.val;
count[0] += map.getOrDefault(currSum - targetSum, 0);
map.put(currSum, map.getOrDefault(currSum, 0) + 1);
preorder(root.left, currSum, map, count, targetSum);
preorder(root.right, currSum, map, count, targetSum);
map.put(currSum, map.get(currSum) - 1);
}
}
Copy The Code &
Try With Live Editor
Input
Output
#3 Code Example with Javascript Programming
Code -
Javascript Programming
function pathSum(root, sum) {
const preSums = new Map([[0, 1]]);
let count = 0;
visit(root, 0);
return count;
function visit(node, preSum) {
if (!node) return;
preSum += node.val;
count += preSums.get(preSum - sum) || 0;
preSums.set(preSum, (preSums.get(preSum) || 0) + 1);
visit(node.left, preSum);
visit(node.right, preSum);
preSums.set(preSum, preSums.get(preSum) - 1);
}
}
Copy The Code &
Try With Live Editor
Input
Output
#4 Code Example with Python Programming
Code -
Python Programming
class Solution:
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
dic = {}
def traverse(node, parent):
if not node: return
dic[node] = [node.val]
if node.val == sum: res[0] += 1
if parent:
for num in dic[parent]:
dic[node].append(num + node.val)
if num + node.val == sum: res[0] += 1
traverse(node.left, node)
traverse(node.right, node)
res = [0]
traverse(root, None)
return res[0]
Copy The Code &
Try With Live Editor
Input
Output
#5 Code Example with C# Programming
Code -
C# Programming
using System.Collections.Generic;
namespace LeetCode
{
public class _0437_PathSumIII
{
public int result;
public int PathSum(TreeNode root, int sum)
{
if (root == null) return 0;
Dictionary < int, int> cache = new Dictionary<int, int>() { { 0, 1 } };
DFS(root, sum, 0, cache);
return result;
}
public void DFS(TreeNode root, int target, int currPathSum, Dictionary < int, int> cache)
{
if (root == null) return;
currPathSum += root.val;
int oldPathSum = currPathSum - target;
if (cache.ContainsKey(oldPathSum)) result += cache[oldPathSum];
if (!cache.ContainsKey(currPathSum))
cache.Add(currPathSum, 0);
cache[currPathSum]++;
DFS(root.left, target, currPathSum, cache);
DFS(root.right, target, currPathSum, cache);
cache[currPathSum] -= 1;
}
}
}
Copy The Code &
Try With Live Editor
Input
Output