Add BST and differentiate Stack.
This commit is contained in:
parent
434881f877
commit
c0dc9e794e
76
src/bst.rs
Normal file
76
src/bst.rs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
use std::cmp::Ordering::*;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct BinarySearchTree<T: Ord> {
|
||||||
|
root: Option<Box<Node<T>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Node<T> {
|
||||||
|
data: T,
|
||||||
|
left: Option<Box<Node<T>>>,
|
||||||
|
right: Option<Box<Node<T>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Ord> BinarySearchTree<T> {
|
||||||
|
pub fn new() -> BinarySearchTree<T> {
|
||||||
|
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<T> {
|
||||||
|
self.root.take().map(|mut root| root.find(data))?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Ord> Node<T> {
|
||||||
|
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<T> {
|
||||||
|
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))?,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
73
src/main.rs
73
src/main.rs
@ -1,3 +1,9 @@
|
|||||||
|
mod bst;
|
||||||
|
mod stack;
|
||||||
|
|
||||||
|
use bst::BinarySearchTree;
|
||||||
|
use stack::Stack;
|
||||||
|
|
||||||
struct Greeter {
|
struct Greeter {
|
||||||
greeting: &'static str,
|
greeting: &'static str,
|
||||||
}
|
}
|
||||||
@ -12,59 +18,28 @@ impl Greeter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LinkedList<T> {
|
|
||||||
head: Link<T>,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Link<T> {
|
|
||||||
Empty,
|
|
||||||
More(Box<Node<T>>),
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Node<T> {
|
|
||||||
data: T,
|
|
||||||
next: Link<T>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> LinkedList<T> {
|
|
||||||
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<T> {
|
|
||||||
match std::mem::replace(&mut self.head, Link::Empty) {
|
|
||||||
Link::Empty => None,
|
|
||||||
Link::More(node) => {
|
|
||||||
self.head = node.next;
|
|
||||||
Some(node.data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> Iterator for LinkedList<T> {
|
|
||||||
type Item = T;
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
|
||||||
self.pop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
Greeter::new("Hello, Jesse!").greet();
|
Greeter::new("Hello, Jesse!").greet();
|
||||||
|
|
||||||
let mut my_linked_list = LinkedList::new();
|
let mut my_stack = Stack::new();
|
||||||
my_linked_list.push(Greeter::new("Hello"));
|
my_stack.push(Greeter::new("Hello"));
|
||||||
my_linked_list.push(Greeter::new("Beautiful"));
|
my_stack.push(Greeter::new("Beautiful"));
|
||||||
my_linked_list.push(Greeter::new("World"));
|
my_stack.push(Greeter::new("World"));
|
||||||
|
|
||||||
for greeter in my_linked_list {
|
for greeter in my_stack {
|
||||||
greeter.greet();
|
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));
|
||||||
}
|
}
|
||||||
|
43
src/stack.rs
Normal file
43
src/stack.rs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
pub struct Stack<T> {
|
||||||
|
head: Link<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Link<T> {
|
||||||
|
Empty,
|
||||||
|
More(Box<Node<T>>),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Node<T> {
|
||||||
|
data: T,
|
||||||
|
next: Link<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Stack<T> {
|
||||||
|
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<T> {
|
||||||
|
match std::mem::replace(&mut self.head, Link::Empty) {
|
||||||
|
Link::Empty => None,
|
||||||
|
Link::More(node) => {
|
||||||
|
self.head = node.next;
|
||||||
|
Some(node.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Iterator for Stack<T> {
|
||||||
|
type Item = T;
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
self.pop()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user