diff options
Diffstat (limited to 'src/tree.rs')
-rw-r--r-- | src/tree.rs | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/tree.rs b/src/tree.rs index e217b37..134b614 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -7,7 +7,11 @@ use std::fmt::Display; pub struct Tree<T: Copy> { pub root_node: TreeNode<T>, } -impl<T: Copy> Tree<T> { +pub enum InsertDirection { + Left, + Right, +} +impl<T: Copy + Display> Tree<T> { /// Takes reducer function input with following signature. /// /// The caller should ensure that reducer function returns same type as @@ -40,6 +44,17 @@ impl<T: Copy> Tree<T> { pub fn insert_right(&mut self, v: T) { self.root_node.insert_right(v); } + pub fn insert(&mut self, v: T, predicate: fn(T, T) -> InsertDirection) { + self.root_node.insert(v, predicate); + } + pub fn level_order(&self) { + let mut a: Vec<T> = vec![]; + self.root_node.level_order_rec(0, &mut a); + for elem in a { + print!("{},", elem); + } + println!(); + } } impl<T: Display + Copy> Display for Tree<T> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -77,7 +92,6 @@ impl<T: Copy + Display> Display for TreeNode<T> { } } impl<T: Copy> TreeNode<T> { - /// Initialises a new node for a Tree. pub fn new(v: T) -> TreeNode<T> { TreeNode { @@ -119,4 +133,30 @@ impl<T: Copy> TreeNode<T> { } self.right = Some(Box::new(TreeNode::new(value))) } + pub fn insert(&mut self, item: T, predicate: fn(T, T) -> InsertDirection) { + match predicate(item, self.value) { + InsertDirection::Left => { + if let Some(node) = &mut self.left { + node.insert(item, predicate); + } else { + self.left = Some(Box::new(TreeNode::new(item))) + } + } + InsertDirection::Right => { + if let Some(node) = &mut self.right { + node.insert(item, predicate); + } else { + self.right = Some(Box::new(TreeNode::new(item))) + } + } + } + } + pub fn level_order_rec(&self, level: usize, arr: &mut Vec<T>) { + if arr.len() < level { + arr.push(self.value); + } + arr.insert(level, self.value); + if let Some(node) = &self.left { node.level_order_rec(level + 1, arr);} + if let Some(node) = &self.right { node.level_order_rec(level + 1, arr);} + } } |