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.
#
# defmodule TreeNode do
# @type t :: %__MODULE__{
# val: integer,
# left: TreeNode.t() | nil,
# right: TreeNode.t() | nil
# }
# defstruct val: 0, left: nil, right: nil
# end
defmodule Solution do
def path_sum(nil, _, _), do: 0
@spec path_sum(root :: TreeNode.t | nil, target_sum :: integer, partial_sums :: [integer]) :: integer
def path_sum(root, target_sum, partial_sums \\ []) do
new_partials = [root.val | Enum.map(partial_sums, &(&1 + root.val))]
equal_path = Enum.count(Enum.filter(new_partials, &(&1 == target_sum)))
equal_path +
path_sum(root.left, target_sum, new_partials) +
path_sum(root.right, target_sum, new_partials)
end
end