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";