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 {}