summaryrefslogtreecommitdiff
path: root/src/tree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.rs')
-rw-r--r--src/tree.rs44
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);}
+ }
}