mod avl_operations;
pub mod node;
pub mod visualization;
use node::AVLNode;
#[derive(Debug)]
pub struct AVLTree<T: PartialOrd + Clone> {
root: Option<Box<AVLNode<T>>>,
min_value: Option<T>,
max_value: Option<T>,
}
impl<T: PartialOrd + Clone> AVLTree<T> {
pub fn is_balanced(&self) -> bool {
fn check_balance<T: PartialOrd>(node: &Option<Box<AVLNode<T>>>) -> bool {
match node {
Some(node) => {
let balance = node.balance_factor();
balance.abs() <= 1 && check_balance(&node.left) && check_balance(&node.right)
}
None => true,
}
}
check_balance(&self.root)
}
pub fn is_valid_bst(&self) -> bool {
fn check<T: PartialOrd>(
node: &Option<Box<AVLNode<T>>>,
min: Option<&T>,
max: Option<&T>,
) -> bool {
match node {
Some(node) => {
if let Some(min_val) = min
&& &node.value <= min_val {
return false;
}
if let Some(max_val) = max
&& &node.value >= max_val {
return false;
}
check(&node.left, min, Some(&node.value))
&& check(&node.right, Some(&node.value), max)
}
None => true,
}
}
check(&self.root, None, None)
}
}