rust_test/src/main.rs

45 lines
1.4 KiB
Rust
Raw Normal View History

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};
struct Solution;
2025-09-06 21:58:55 +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 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-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
}
}
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);
println!("{:?}", sl);
}