leetcode_trees_rs/macros/
helper_functions.rs

1use crate::utils::TreeNode;
2use std::{cell::RefCell, collections::VecDeque, rc::Rc};
3
4/// Boilerplate...
5#[doc(hidden)]
6fn rc_cell_tree_node(val: i32) -> Rc<RefCell<TreeNode>> {
7    Rc::new(RefCell::new(TreeNode::new(val)))
8}
9
10/// This function can be inferred from the `tree!()` macro which works and is documented based on
11/// it.
12#[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}