use std::rc::Rc; use std::cell::RefCell; use std::collections::VecDeque; #[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 } } } pub fn build_tree(vals: &[Option]) -> Option>> { if vals.is_empty() || vals[0].is_none() { return None; } let root = Rc::new(RefCell::new(TreeNode::new(vals[0].unwrap()))); let mut queue = VecDeque::new(); queue.push_back(root.clone()); let mut i = 1; while i < vals.len() { if let Some(node) = queue.pop_front() { if i < vals.len() { if let Some(val) = vals[i] { let left = Rc::new(RefCell::new(TreeNode::new(val))); node.borrow_mut().left = Some(left.clone()); queue.push_back(left); } i += 1; } if i < vals.len() { if let Some(val) = vals[i] { let right = Rc::new(RefCell::new(TreeNode::new(val))); node.borrow_mut().right = Some(right.clone()); queue.push_back(right); } i += 1; } } } Some(root) }