Self-Balancing-Binary-Trees / src / main.rs
main.rs
Raw
mod red_black_tree;
mod avl_tree;
mod binary_tree_ops;

use red_black_tree::RedBlackTreeImpl;
use avl_tree::AVLTreeImpl;
use binary_tree_ops::BinaryTreeOps;
use std::io;

fn main() {
    let mut red_black_tree = RedBlackTreeImpl::new();
    let mut avl_tree = AVLTreeImpl::new();

    loop {
        println!("\nChoose an operation:");
        println!("1. Insert into Red-Black Tree");
        println!("2. Delete from Red-Black Tree");
        println!("3. Print Red-Black Tree In-Order");
        println!("4. Visualize Red-Black Tree");
        println!("5. Insert into AVL Tree");
        println!("6. Delete from AVL Tree");
        println!("7. Print AVL Tree In-Order");
        println!("8. Visualize AVL Tree");
        println!("9. Compare Heights");
        println!("10. Compare Leaf Counts");
        println!("11. Is Red-Black Tree or AVL Tree Empty?");
        println!("12. Exit");

        let mut choice = String::new();
        io::stdin().read_line(&mut choice).expect("Failed to read input");

        match choice.trim() {
            "1" => {
                let key: i32 = get_user_input("Enter value to insert into Red-Black Tree:");
                red_black_tree.insert(key);
            }
            "2" => {
                let key: i32 = get_user_input("Enter value to delete from Red-Black Tree:");
                red_black_tree.delete(key);
            }
            "3" => {
                println!("Red-Black Tree In-Order Traversal:");
                red_black_tree.in_order_traversal();
            }
            "4" => {
                println!("Red-Black Tree Visualization:");
                red_black_tree.visualize();
            }
            "5" => {
                let key: i32 = get_user_input("Enter value to insert into AVL Tree:");
                avl_tree.insert(key);
            }
            "6" => {
                let key: i32 = get_user_input("Enter value to delete from AVL Tree:");
                avl_tree.delete(key);
            }
            "7" => {
                println!("AVL Tree In-Order Traversal:");
                avl_tree.in_order_traversal();
            }
            "8" => {
                println!("AVL Tree Visualization:");
                avl_tree.visualize();
            }
            "9" => {
                println!("Red-Black Tree Height: {}", red_black_tree.height());
                println!("AVL Tree Height: {}", avl_tree.height());
            }
            "10" => {
                println!("Red-Black Tree Leaves: {}", red_black_tree.count_leaves());
                println!("AVL Tree Leaves: {}", avl_tree.count_leaves());
            }
            "11" => {
                println!("Is Red-Black Tree Empty? {}", red_black_tree.is_empty());
                println!("Is AVL Tree Empty? {}", avl_tree.is_empty());
            }
            "12" => {
                println!("Exiting...");
                break;
            }
            _ => println!("Invalid choice. Try again."),
        }
    }
}

fn get_user_input<T: std::str::FromStr>(prompt: &str) -> T {
    loop {
        println!("{}", prompt);
        let mut input = String::new();
        io::stdin().read_line(&mut input).expect("Failed to read input");
        if let Ok(value) = input.trim().parse::<T>() {
            return value;
        }
        println!("Invalid input. Please enter a valid value.");
    }
}

#[cfg(test)]
mod unit_tests;