2023-03-07 23:46:28 +08:00
/**
* File : tree_node . rs
* Created Time : 2023 - 02 - 27
* Author : xBLACKICEx ( xBLACKICE @ outlook . com )
* /
use std ::cell ::RefCell ;
2023-04-21 14:58:46 +08:00
use std ::collections ::VecDeque ;
2023-03-07 23:46:28 +08:00
use std ::rc ::Rc ;
#[ allow(dead_code) ]
2023-07-16 01:32:43 +08:00
#[ derive(Debug) ]
2023-03-07 23:46:28 +08:00
pub struct TreeNode {
pub val : i32 ,
2023-07-16 01:32:43 +08:00
pub height : i32 ,
2023-03-07 23:46:28 +08:00
pub parent : Option < Rc < RefCell < TreeNode > > > ,
pub left : Option < Rc < RefCell < TreeNode > > > ,
pub right : Option < Rc < RefCell < TreeNode > > > ,
}
impl TreeNode {
pub fn new ( val : i32 ) -> Rc < RefCell < Self > > {
Rc ::new ( RefCell ::new ( Self {
val ,
2023-07-16 01:32:43 +08:00
height : 0 ,
2023-03-07 23:46:28 +08:00
parent : None ,
left : None ,
right : None
} ) )
}
2023-04-21 14:58:46 +08:00
}
#[ macro_export ]
macro_rules ! op_vec {
( $( $x :expr ) , * ) = > {
vec! [
$( Option ::from ( $x ) . map ( | x | x ) ) , *
]
} ;
}
/// This function takes a vector of integers and generates a binary tree from it in a level order traversal manner.
/// The first element of the vector is used as the root node of the tree. Each node in the tree is represented by a `TreeNode` struct that has a value and pointers to its left and right children.
///
/// # Arguments
///
/// * `list` - A vector of integers to be used to generate the binary tree.
///
/// # Returns
///
/// An `Option<Rc<RefCell<TreeNode>>>` where the `Option` is `None` if the vector is empty, and `Some` containing the root node of the tree otherwise.
///
/// # Examples
///
/// ```
/// use std::rc::Rc;
/// use std::cell::RefCell;
/// use std::collections::VecDeque;
///
/// let list = vec![1, 2, 3, 4, 5, 6, 7];
/// let root = vec_to_tree(list).unwrap();
///
/// // The resulting tree looks like:
/// //
/// // 1
/// // / \
/// // 2 3
/// // / \ / \
/// // 4 56 7
/// ```
pub fn vec_to_tree ( list : Vec < Option < i32 > > ) -> Option < Rc < RefCell < TreeNode > > > {
if list . is_empty ( ) {
return None ;
}
let root = TreeNode ::new ( list [ 0 ] . unwrap ( ) ) ;
let mut que = VecDeque ::new ( ) ;
que . push_back ( Rc ::clone ( & root ) ) ;
let mut index = 0 ;
while let Some ( node ) = que . pop_front ( ) {
index + = 1 ;
if index > = list . len ( ) {
break ;
}
if let Some ( val ) = list [ index ] {
node . borrow_mut ( ) . left = Some ( TreeNode ::new ( val ) ) ;
que . push_back ( Rc ::clone ( & node . borrow ( ) . left . as_ref ( ) . unwrap ( ) ) ) ;
}
index + = 1 ;
if index > = list . len ( ) {
break ;
}
if let Some ( val ) = list [ index ] {
node . borrow_mut ( ) . right = Some ( TreeNode ::new ( val ) ) ;
que . push_back ( Rc ::clone ( & node . borrow ( ) . right . as_ref ( ) . unwrap ( ) ) ) ;
}
}
Some ( root )
2023-03-07 23:46:28 +08:00
}