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.
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
pub fn path_sum(root: Option<Rc<RefCell<TreeNode>>>, target_sum: i32) -> i32 {
let target_sum = target_sum as i64;
let mut stack = vec![(root, vec![])];
let mut ans = 0;
while let Some((node, mut path)) = stack.pop() {
if let Some(node) = node {
let node = node.borrow();
path.push(node.val);
ans += path
.iter()
.rev()
.fold((0, 0), |(res, acc), &x| {
let new_acc = acc + x as i64;
(
res + (new_acc == target_sum) as i32,
new_acc
)
})
.0;
stack.push((node.left.clone(), path.clone()));
stack.push((node.right.clone(), path.clone()));
} else {
continue;
}
}
ans
}
}