Medium
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:
[0, 1000]
.-109 <= Node.val <= 109
-1000 <= targetSum <= 1000
%% Definition for a binary tree node.
%%
%% -record(tree_node, {val = 0 :: integer(),
%% left = null :: 'null' | #tree_node{},
%% right = null :: 'null' | #tree_node{}}).
-spec path_sum(Root :: #tree_node{} | null, TargetSum :: integer()) -> integer().
path_sum(null, _TargetSum) -> 0;
path_sum(Root, TargetSum) ->
path_sum(Root, TargetSum, []).
path_sum(null, _TargetSum, _PartialSums) -> 0;
path_sum(Root, TargetSum, PartialSums) ->
NewPartials = [Root#tree_node.val | [Sum + Root#tree_node.val || Sum <- PartialSums]],
EqualPaths = length([Sum || Sum <- NewPartials, Sum =:= TargetSum]),
EqualPaths +
path_sum(Root#tree_node.left, TargetSum, NewPartials) +
path_sum(Root#tree_node.right, TargetSum, NewPartials).