[][src]Constant cauly_rust_leetcode_utils::BINARY_TREE_SRC

pub const BINARY_TREE_SRC: &'static str = "use std::cell::RefCell;\nuse std::rc::Rc;\n\n// #region LeetCode TreeNode\n#[derive(Debug, PartialEq, Eq)]\npub struct TreeNode {\n    pub val: i32,\n    pub left: Option<Rc<RefCell<TreeNode>>>,\n    pub right: Option<Rc<RefCell<TreeNode>>>,\n}\n\nimpl TreeNode {\n    #[inline]\n    pub fn new(val: i32) -> Self {\n        TreeNode {\n            val,\n            left: None,\n            right: None,\n        }\n    }\n}\n// endregion\n\n// #region Tree ext\n\n#[derive(PartialEq, Copy, Clone)]\npub enum TraversalType {\n    Inorder,\n    Preorder,\n    Postorder,\n}\n\npub trait RefTreeNode {\n    fn get_val(&self) -> Option<i32>;\n    fn get_left(&self) -> Option<Rc<RefCell<TreeNode>>>;\n    fn get_right(&self) -> Option<Rc<RefCell<TreeNode>>>;\n    fn set_val(&mut self, v: i32);\n    fn set_sub_nodes(\n        &self,\n        left: &Option<Rc<RefCell<TreeNode>>>,\n        right: &Option<Rc<RefCell<TreeNode>>>,\n    );\n    fn walk(&self, t: TraversalType, func: fn(Option<Rc<RefCell<TreeNode>>>));\n    fn walk_t<T>(\n        &self,\n        t: TraversalType,\n        result: &mut T,\n        func: fn(&mut T, Option<Rc<RefCell<TreeNode>>>),\n    );\n    fn aggregate<T>(\n        &self,\n        val_func: fn(Option<Rc<RefCell<TreeNode>>>) -> T,\n        aggr_func: fn(T, Option<T>, Option<T>) -> Option<T>,\n    ) -> Option<T>;\n    fn aggregate_t<R, T>(\n        &self,\n        result: &mut R,\n        val_func: fn(&mut R, Option<Rc<RefCell<TreeNode>>>) -> T,\n        aggr_func: fn(&mut R, T, Option<T>, Option<T>) -> Option<T>,\n    ) -> Option<T>;\n}\n\nimpl RefTreeNode for Option<Rc<RefCell<TreeNode>>> {\n    fn get_val(&self) -> Option<i32> {\n        if let Some(n) = self {\n            let n = n.borrow();\n            Some(n.val)\n        } else {\n            None\n        }\n    }\n    fn get_left(&self) -> Option<Rc<RefCell<TreeNode>>> {\n        if let Some(n) = self {\n            let n = n.borrow();\n            if let Some(l) = &n.left {\n                return Some(Rc::clone(&l));\n            }\n        }\n        None\n    }\n    fn get_right(&self) -> Option<Rc<RefCell<TreeNode>>> {\n        if let Some(n) = self {\n            let n = n.borrow();\n            if let Some(l) = &n.right {\n                return Some(Rc::clone(&l));\n            }\n        }\n        None\n    }\n    fn set_val(&mut self, v: i32) {\n        if let Some(n) = self {\n            let mut n = n.borrow_mut();\n            n.val = v;\n        }\n    }\n    fn set_sub_nodes(\n        &self,\n        left: &Option<Rc<RefCell<TreeNode>>>,\n        right: &Option<Rc<RefCell<TreeNode>>>,\n    ) {\n        if let Some(n) = self {\n            let mut n = n.borrow_mut();\n            n.left = match left {\n                None => None,\n                Some(n) => Some(Rc::clone(n)),\n            };\n            n.right = match right {\n                None => None,\n                Some(n) => Some(Rc::clone(n)),\n            };\n        }\n    }\n    fn walk(&self, t: TraversalType, func: fn(Option<Rc<RefCell<TreeNode>>>)) {\n        if let Some(node) = self {\n            if t == TraversalType::Preorder {\n                func(Some(Rc::clone(&node)));\n            }\n            {\n                let n = node.borrow();\n                if let Some(left) = &n.left {\n                    Some(Rc::clone(left)).walk(t, func);\n                }\n            }\n            if t == TraversalType::Inorder {\n                func(Some(Rc::clone(&node)));\n            }\n            {\n                let n = node.borrow();\n                if let Some(right) = &n.right {\n                    Some(Rc::clone(right)).walk(t, func);\n                }\n            }\n            if t == TraversalType::Postorder {\n                func(Some(Rc::clone(&node)));\n            }\n        }\n    }\n    fn walk_t<T>(\n        &self,\n        t: TraversalType,\n        result: &mut T,\n        func: fn(&mut T, Option<Rc<RefCell<TreeNode>>>),\n    ) {\n        if let Some(node) = self {\n            if t == TraversalType::Preorder {\n                func(result, Some(Rc::clone(&node)));\n            }\n            {\n                let n = node.borrow();\n                if let Some(left) = &n.left {\n                    Some(Rc::clone(left)).walk_t(t, result, func);\n                }\n            }\n            if t == TraversalType::Inorder {\n                func(result, Some(Rc::clone(&node)));\n            }\n            {\n                let n = node.borrow();\n                if let Some(right) = &n.right {\n                    Some(Rc::clone(right)).walk_t(t, result, func);\n                }\n            }\n            if t == TraversalType::Postorder {\n                func(result, Some(Rc::clone(&node)));\n            }\n        }\n    }\n    fn aggregate<T>(\n        &self,\n        val_func: fn(Option<Rc<RefCell<TreeNode>>>) -> T,\n        aggr_func: fn(T, Option<T>, Option<T>) -> Option<T>,\n    ) -> Option<T> {\n        if let Some(node) = self {\n            let n = node.borrow();\n            let mut lval = None;\n            let mut rval = None;\n            if let Some(left) = &n.left {\n                lval = Some(Rc::clone(left)).aggregate(val_func, aggr_func);\n            }\n            if let Some(right) = &n.right {\n                rval = Some(Rc::clone(right)).aggregate(val_func, aggr_func);\n            }\n            let val = val_func(Some(Rc::clone(&node)));\n            aggr_func(val, lval, rval)\n        } else {\n            None\n        }\n    }\n    fn aggregate_t<R, T>(\n        &self,\n        result: &mut R,\n        val_func: fn(&mut R, Option<Rc<RefCell<TreeNode>>>) -> T,\n        aggr_func: fn(&mut R, T, Option<T>, Option<T>) -> Option<T>,\n    ) -> Option<T> {\n        if let Some(node) = self {\n            let n = node.borrow();\n            let mut lval = None;\n            let mut rval = None;\n            if let Some(left) = &n.left {\n                lval = Some(Rc::clone(left)).aggregate_t(result, val_func, aggr_func);\n            }\n            if let Some(right) = &n.right {\n                rval = Some(Rc::clone(right)).aggregate_t(result, val_func, aggr_func);\n            }\n            let val = val_func(result, Some(Rc::clone(&node)));\n            aggr_func(result, val, lval, rval)\n        } else {\n            None\n        }\n    }\n}\n\nimpl TreeNode {\n    pub fn from_string(s: &str) -> Option<Rc<RefCell<TreeNode>>> {\n        let v: Vec<&str> = s.split(\',\').collect();\n        if v.len() == 0 {\n            None\n        } else {\n            let root = Rc::new(RefCell::new(TreeNode::new(v[0].parse().unwrap())));\n            let mut last_row = vec![Rc::clone(&root)];\n            let mut iter = v.iter().skip(1);\n            \'outer: loop {\n                let mut new_row = Vec::new();\n                for parent in last_row.iter_mut() {\n                    let left = match iter.next() {\n                        Some(&\"null\") => None,\n                        Some(num) => {\n                            Some(Rc::from(RefCell::from(TreeNode::new(num.parse().unwrap()))))\n                        }\n                        _ => break \'outer,\n                    };\n                    let right = match iter.next() {\n                        Some(&\"null\") => None,\n                        Some(num) => {\n                            Some(Rc::from(RefCell::from(TreeNode::new(num.parse().unwrap()))))\n                        }\n                        _ => None,\n                    };\n                    Some(Rc::clone(parent)).set_sub_nodes(&left, &right);\n                    if left != None {\n                        new_row.push(left.unwrap());\n                    }\n                    if right != None {\n                        new_row.push(right.unwrap());\n                    }\n                }\n                last_row = new_row;\n                if last_row.len() == 0 {\n                    break;\n                }\n            }\n\n            Some(root)\n        }\n    }\n}\n// #endregion\n";