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;