rustgym_util/
tree.rs

1#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
2pub struct TreeNode {
3    pub val: i32,
4    pub left: TreeLink,
5    pub right: TreeLink,
6}
7pub type TreeLink = Option<Rc<RefCell<TreeNode>>>;
8
9#[macro_export]
10macro_rules! tree {
11    ($e:expr) => {
12        TreeLink::leaf($e)
13    };
14    ($e:expr, $l:expr, $r:expr) => {
15        TreeLink::branch($e, $l, $r)
16    };
17}
18
19use std::cell::RefCell;
20use std::rc::Rc;
21
22pub trait TreeMaker {
23    fn branch(val: i32, left: TreeLink, right: TreeLink) -> TreeLink {
24        Some(Rc::new(RefCell::new(TreeNode { val, left, right })))
25    }
26    fn leaf(val: i32) -> TreeLink {
27        Some(Rc::new(RefCell::new(TreeNode {
28            val,
29            left: None,
30            right: None,
31        })))
32    }
33}
34
35impl TreeMaker for TreeLink {}