leetcode_trees_rs/macros/
helper_functions.rs1use crate::utils::TreeNode;
2use std::{cell::RefCell, collections::VecDeque, rc::Rc};
3
4#[doc(hidden)]
6fn rc_cell_tree_node(val: i32) -> Rc<RefCell<TreeNode>> {
7 Rc::new(RefCell::new(TreeNode::new(val)))
8}
9
10#[doc(hidden)]
13pub fn _build_tree(levels: &[Vec<Option<i32>>]) -> Option<Rc<RefCell<TreeNode>>> {
14 if levels.is_empty() || levels[0].is_empty() || levels[0][0].is_none() {
15 return None;
16 }
17
18 let root = rc_cell_tree_node(levels[0][0].unwrap());
19
20 let mut queue = VecDeque::new();
21 queue.push_back(Rc::clone(&root));
22
23 for (i, _) in levels.iter().enumerate().skip(1) {
24 let mut next_level_nodes = VecDeque::new();
25 let mut curr_item = 0;
26
27 for parent in &queue {
28 if let Some(Some(left_val)) = levels[i].get(curr_item) {
29 let left_child = rc_cell_tree_node(*left_val);
30 parent.borrow_mut().left = Some(Rc::clone(&left_child));
31 next_level_nodes.push_back(left_child);
32 }
33 curr_item += 1;
34
35 if let Some(Some(right_val)) = levels[i].get(curr_item) {
36 let right_child = rc_cell_tree_node(*right_val);
37 parent.borrow_mut().right = Some(Rc::clone(&right_child));
38 next_level_nodes.push_back(right_child);
39 }
40 curr_item += 1;
41 }
42
43 queue = next_level_nodes;
44 }
45
46 Some(root)
47}