48 lines
1.4 KiB
Rust
48 lines
1.4 KiB
Rust
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<Rc<RefCell<TreeNode>>>,
|
|
pub right: Option<Rc<RefCell<TreeNode>>>,
|
|
}
|
|
|
|
impl TreeNode {
|
|
#[inline]
|
|
pub fn new(val: i32) -> Self {
|
|
TreeNode { val, left: None, right: None }
|
|
}
|
|
}
|
|
|
|
pub fn build_tree(vals: &[Option<i32>]) -> Option<Rc<RefCell<TreeNode>>> {
|
|
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)
|
|
} |