From d251733113c5a846cf626441221c782c0edbc94f Mon Sep 17 00:00:00 2001 From: jackfiled Date: Mon, 26 Feb 2024 09:16:06 +0800 Subject: [PATCH] 20240226 Finished --- src/problem/mod.rs | 3 +- src/problem/p938_range_sum_of_bst.rs | 79 ++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/problem/p938_range_sum_of_bst.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 49f8fe8..a4ae5ee 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -54,4 +54,5 @@ mod p105_construct_binary_tree_from_preorder_and_inorder_traversal; mod p106_construct_binary_tree_from_inorder_and_postorder_traversal; mod p235_lowest_common_ancestor_of_a_binary_search_tree; mod p2583_kth_largest_sum_in_a_binary_tree; -mod p2476_closest_nodes_queries_in_a_binary_search_tree; \ No newline at end of file +mod p2476_closest_nodes_queries_in_a_binary_search_tree; +mod p938_range_sum_of_bst; \ No newline at end of file diff --git a/src/problem/p938_range_sum_of_bst.rs b/src/problem/p938_range_sum_of_bst.rs new file mode 100644 index 0000000..dd1b277 --- /dev/null +++ b/src/problem/p938_range_sum_of_bst.rs @@ -0,0 +1,79 @@ +/** + * [938] Range Sum of BST + */ +pub struct Solution {} + +use crate::util::tree::{TreeNode, to_tree}; + +// submission codes start here + +// Definition for a binary tree node. +// #[derive(Debug, PartialEq, Eq)] +// pub struct TreeNode { +// pub val: i32, +// pub left: Option>>, +// pub right: Option>>, +// } +// +// impl TreeNode { +// #[inline] +// pub fn new(val: i32) -> Self { +// TreeNode { +// val, +// left: None, +// right: None +// } +// } +// } +use std::rc::Rc; +use std::cell::RefCell; +use std::collections::VecDeque; +impl Solution { + pub fn range_sum_bst(root: Option>>, low: i32, high: i32) -> i32 { + let root = if let Some(r) = root { + r + } else { + return 0; + }; + + let mut sum = 0; + + let mut deque = VecDeque::new(); + deque.push_back(root); + + while !deque.is_empty() { + let node = deque.pop_front().unwrap(); + + if node.borrow().val >= low && node.borrow().val <= high { + sum += node.borrow().val; + } + + if node.borrow().val > low { + if let Some(left) = &node.borrow().left { + deque.push_back(Rc::clone(left)); + } + } + + if node.borrow().val < high { + if let Some(right) = &node.borrow().right { + deque.push_back(Rc::clone(right)); + } + } + } + + sum + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_938() { + assert_eq!(Solution::range_sum_bst( + to_tree(vec![Some(10), Some(5), Some(15), Some(3), Some(7), None, Some(18)]), 7, 15), 32); + } +}