2025-09-06 21:58:55 +08:00
|
|
|
mod tree;
|
|
|
|
use std::rc::Rc;
|
|
|
|
use std::cell::RefCell;
|
|
|
|
use std::collections::HashMap;
|
|
|
|
use tree::{TreeNode, build_tree};
|
|
|
|
|
2025-07-10 14:13:01 +08:00
|
|
|
struct Solution;
|
2025-09-06 21:58:55 +08:00
|
|
|
|
2025-07-10 14:13:01 +08:00
|
|
|
impl Solution {
|
2025-09-06 21:58:55 +08:00
|
|
|
fn dfs(root: Option<Rc<RefCell<TreeNode>>>, target: i64) -> (HashMap<i64,i32>,i32) {
|
|
|
|
if root.is_none() {
|
|
|
|
return (HashMap::new(),0);
|
2025-09-06 15:41:02 +08:00
|
|
|
}
|
2025-09-06 21:58:55 +08:00
|
|
|
let node = root.unwrap();
|
|
|
|
let val = node.borrow().val;
|
|
|
|
let val = val as i64;
|
|
|
|
let mut ans = if val == target { 1 } else { 0 };
|
|
|
|
let (left,left_ans) = Self::dfs(node.borrow().left.clone(), target);
|
|
|
|
let (right, right_ans) = Self::dfs(node.borrow().right.clone(), target);
|
|
|
|
ans += left_ans + right_ans;
|
|
|
|
ans += *left.get(&(target - val)).unwrap_or(&0);
|
|
|
|
ans += *right.get(&(target - val)).unwrap_or(&0);
|
|
|
|
let mut map = HashMap::new();
|
|
|
|
map.insert(val, 1);
|
|
|
|
for (k,v) in left.iter().chain(right.iter()) {
|
|
|
|
*map.entry(k + val).or_insert(0) += v;
|
2025-09-05 11:41:56 +08:00
|
|
|
}
|
2025-09-06 21:58:55 +08:00
|
|
|
(map,ans)
|
|
|
|
}
|
|
|
|
pub fn path_sum(root: Option<Rc<RefCell<TreeNode>>>, target_sum: i32) -> i32 {
|
|
|
|
let (_,ans) = Self::dfs(root, target_sum as i64);
|
|
|
|
ans
|
2025-07-10 14:13:01 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
2025-09-06 21:58:55 +08:00
|
|
|
let vals = vec![
|
|
|
|
Some(10), Some(5), Some(-3), Some(3), Some(2), None, Some(11),
|
|
|
|
Some(3), Some(-2), None, Some(1)
|
|
|
|
];
|
|
|
|
let root = build_tree(&vals);
|
|
|
|
let sl = Solution::path_sum(root, 8);
|
2025-07-29 11:20:14 +08:00
|
|
|
println!("{:?}", sl);
|
2025-07-10 14:13:01 +08:00
|
|
|
}
|