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.
#|
; val : integer?
; left : (or/c tree-node? #f)
; right : (or/c tree-node? #f)
(struct tree-node
(val left right) #:mutable #:transparent)
; constructor
(define (make-tree-node [val 0])
(tree-node val #f #f))
|#
(define/contract (path-sum root targetSum)
(-> (or/c tree-node? #f) exact-integer? exact-integer?)
(let recur ([root root][candidates empty])
(if (boolean? root) 0
(let ([new-candidates
(cons (tree-node-val root)
(map (lambda (i) (+ i (tree-node-val root))) candidates))])
(+ (recur (tree-node-left root) new-candidates) (recur (tree-node-right root) new-candidates)
(foldl (lambda (i res) (+ res (if (= i targetSum) 1 0))) 0 new-candidates))))))