From c0dc9e794e121a9171ab05acb727437777cbfc7f Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Fri, 22 Nov 2024 15:41:29 -0600 Subject: [PATCH] Add BST and differentiate Stack. --- src/bst.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 73 +++++++++++++++++-------------------------------- src/stack.rs | 43 +++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 49 deletions(-) create mode 100644 src/bst.rs create mode 100644 src/stack.rs diff --git a/src/bst.rs b/src/bst.rs new file mode 100644 index 0000000..33fc57a --- /dev/null +++ b/src/bst.rs @@ -0,0 +1,76 @@ +use std::cmp::Ordering::*; + +#[derive(Debug)] +pub struct BinarySearchTree { + root: Option>>, +} + +#[derive(Debug)] +struct Node { + data: T, + left: Option>>, + right: Option>>, +} + +impl BinarySearchTree { + pub fn new() -> BinarySearchTree { + BinarySearchTree { root: None } + } + + pub fn insert(&mut self, data: T) { + match self.root.take() { + None => { + self.root = Some(Box::new(Node { + data, + left: None, + right: None, + })) + } + Some(mut root) => { + root.insert_child(data); + self.root = Some(root); + } + } + } + + pub fn find(&mut self, data: T) -> Option { + self.root.take().map(|mut root| root.find(data))? + } +} + +impl Node { + fn new(data: T) -> Self { + Node { + data, + left: None, + right: None, + } + } + + fn insert_child(&mut self, data: T) { + match self.data.cmp(&data) { + Less => match self.right.take() { + None => self.right = Some(Box::new(Node::new(data))), + Some(mut right) => { + right.insert_child(data); + self.right = Some(right); + } + }, + Equal | Greater => match self.left.take() { + None => self.left = Some(Box::new(Node::new(data))), + Some(mut left) => { + left.insert_child(data); + self.left = Some(left); + } + }, + } + } + + fn find(&mut self, data: T) -> Option { + match self.data.cmp(&data) { + Less => self.right.take().map(|mut right| right.find(data))?, + Equal => Some(data), + Greater => self.left.take().map(|mut left| left.find(data))?, + } + } +} diff --git a/src/main.rs b/src/main.rs index 214b8fb..2141259 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,9 @@ +mod bst; +mod stack; + +use bst::BinarySearchTree; +use stack::Stack; + struct Greeter { greeting: &'static str, } @@ -12,59 +18,28 @@ impl Greeter { } } -struct LinkedList { - head: Link, -} - -enum Link { - Empty, - More(Box>), -} - -struct Node { - data: T, - next: Link, -} - -impl LinkedList { - fn new() -> Self { - LinkedList { head: Link::Empty } - } - - fn push(&mut self, data: T) { - self.head = Link::More(Box::new(Node { - data, - next: std::mem::replace(&mut self.head, Link::Empty), - })); - } - - fn pop(&mut self) -> Option { - match std::mem::replace(&mut self.head, Link::Empty) { - Link::Empty => None, - Link::More(node) => { - self.head = node.next; - Some(node.data) - } - } - } -} - -impl Iterator for LinkedList { - type Item = T; - fn next(&mut self) -> Option { - self.pop() - } -} - fn main() { Greeter::new("Hello, Jesse!").greet(); - let mut my_linked_list = LinkedList::new(); - my_linked_list.push(Greeter::new("Hello")); - my_linked_list.push(Greeter::new("Beautiful")); - my_linked_list.push(Greeter::new("World")); + let mut my_stack = Stack::new(); + my_stack.push(Greeter::new("Hello")); + my_stack.push(Greeter::new("Beautiful")); + my_stack.push(Greeter::new("World")); - for greeter in my_linked_list { + for greeter in my_stack { greeter.greet(); } + + // BST + + let mut bst = BinarySearchTree::new(); + bst.insert(1); + bst.insert(2); + bst.insert(3); + + println!("{:?}", bst); + + bst.insert(0); + println!("{:?}", bst); + println!("find result: {:?}", bst.find(0)); } diff --git a/src/stack.rs b/src/stack.rs new file mode 100644 index 0000000..daa49fd --- /dev/null +++ b/src/stack.rs @@ -0,0 +1,43 @@ +pub struct Stack { + head: Link, +} + +enum Link { + Empty, + More(Box>), +} + +struct Node { + data: T, + next: Link, +} + +impl Stack { + pub fn new() -> Self { + Stack { head: Link::Empty } + } + + pub fn push(&mut self, data: T) { + self.head = Link::More(Box::new(Node { + data, + next: std::mem::replace(&mut self.head, Link::Empty), + })); + } + + pub fn pop(&mut self) -> Option { + match std::mem::replace(&mut self.head, Link::Empty) { + Link::Empty => None, + Link::More(node) => { + self.head = node.next; + Some(node.data) + } + } + } +} + +impl Iterator for Stack { + type Item = T; + fn next(&mut self) -> Option { + self.pop() + } +}