tree_collections 0.1.8

A collection for tree data structures. It provides APIs that allows users to create memory efficient binary search trees, red-black trees and avl trees.
Documentation
use tree_collections::prelude::*;

use std::io::{stdin, stdout, Write};

pub fn get_user_input() -> String {
    let mut line = String::new();
    stdout().flush().expect("failed to flush");
    stdin()
        .read_line(&mut line)
        .expect("failed to read from stdin");
    line.to_string()
}
pub fn get_val(op: &str) -> u32 {
    loop {
        print!("{} value$ ", op);
        let value = get_user_input();
        let trimmed_val = value.trim();
        match trimmed_val.parse::<u32>() {
            Ok(val) => {
                println!("{} value '{}' in tree ... done!", op, val);
                return val;
            }
            Err(..) => {
                println!("this was not an integer number");
            }
        };
    }
}

pub fn avl_promote() {
    println!("\n::--------------AVL Tree--------------::\n");
    let mut tree: AVLTree<u32> = AVLTree::new();

    loop {
        print!("operation$ ");
        let operation = get_user_input();

        match operation.to_lowercase().trim() {
            "insert" => {
                let val = get_val("insert");
                if tree.contains(val) {
                    println!("This value already exists");
                } else {
                    tree.insert(val);
                }
            }
            "delete" => {
                let val = get_val("delete");
                if tree.contains(val) {
                    tree.delete(val);
                } else {
                    println!("This value does not exist");
                }
            }

            "count" => println!("Number of leaves: {:?}", tree.count_leaves()),

            "height" => println!("Height of tree: {:?}", tree.height()),

            "inorder print" => {
                print!("Your tree: ");
                tree.in_order_traversal();
            }

            "preorder print" => {
                print!("Your tree: ");
                tree.pre_order_traversal();
            }

            "empty" => println!("Is the tree empty?: {:?}", tree.is_tree_empty()),

            "search" => {
                let val = get_val("search");
                println!("values found? {:?}", tree.contains(val));
            }

            "print tree" => {
                println!("Your tree: ");
                tree.print();
            }
            "exit" => return,
            _ => println!("Command not recognized. Try 'help' for valid operations"),
        }
    }
}

fn rbt_promote() {
    println!("\n::---------------Red-Black Tree--------------::\n");
    let mut tree = RBTree::new();

    loop {
        print!("operation$ ");
        let operation = get_user_input();

        match operation.to_lowercase().trim() {
            "insert" => {
                let val = get_val("insert");
                if tree.contains(val) {
                    println!("This value already exists");
                } else {
                    tree.insert(val);
                }
            }
            "delete" => {
                let val = get_val("delete");
                if tree.contains(val) {
                    tree.delete(val);
                } else {
                    println!("This value does not exist");
                }
            }
            "count" => println!("Number of leaves: {:?}", tree.count_leaves()),

            "height" => println!("Height of tree: {:?}", tree.height()),

            "inorder print" => {
                print!("Your tree: ");
                tree.in_order_traversal();
            }

            "preorder print" => {
                print!("Your tree: ");
                tree.pre_order_traversal();
            }

            "empty" => println!("Is the tree empty?: {:?}", tree.is_tree_empty()),

            "search" => {
                let val = get_val("search");
                println!("values found? {:?}", tree.contains(val));
            }

            "print tree" => {
                println!("Your tree: ");
                tree.print();
            }
            "exit" => return,
            _ => println!("Command not recognized. Try 'help' for valid operations"),
        }
    }
}

fn rbt_fast_promote() {
    println!("\n::---------------Red-Black Tree--------------::\n");
    let mut tree = FastRBTree::new();

    loop {
        print!("operation$ ");
        let operation = get_user_input();

        match operation.to_lowercase().trim() {
            "insert" => {
                let val = get_val("insert");
                if tree.contains(val) {
                    println!("This value already exists");
                } else {
                    tree.insert(val);
                }
            }
            "delete" => {
                let val = get_val("delete");
                if tree.contains(val) {
                    tree.delete(val);
                } else {
                    println!("This value does not exist");
                }
            }
            "count" => println!("Number of leaves: {:?}", tree.count_leaves()),

            "height" => println!("Height of tree: {:?}", tree.height()),

            "inorder print" => {
                print!("Your tree: ");
                tree.in_order_traversal();
            }

            "preorder print" => {
                print!("Your tree: ");
                tree.pre_order_traversal();
            }

            "empty" => println!("Is the tree empty?: {:?}", tree.is_tree_empty()),

            "search" => {
                let val = get_val("search");
                println!("values found? {:?}", tree.contains(val));
            }

            "print tree" => {
                println!("Your tree: ");
                tree.print();
            }
            "exit" => return,
            _ => println!("Command not recognized. Try 'help' for valid operations"),
        }
    }
}

fn main() {
    println!("Hello!");
    println!("you can select a tree to start or type in 'exit' to leave");
    println!("Select a tree!\n-AVLTree \n-RBTree \n-RBTreeFast or type 'help' to learn about the commands");
    print!("input$ ");
    let selected_tree = get_user_input();

    match selected_tree.to_lowercase().trim() {
        "avltree" => {
            avl_promote();
        }
        "rbtree" => {
            rbt_promote();
        }
        "rbtreefast" => {
            rbt_fast_promote();
        }
        _ => {
            eprint!("Command not recognized. \n");
        }
    }
}