use std::cmp::Ordering; trait Ord { fn cmp(&self, other: &Self) -> Ordering; } struct AVLNode { value: T, left: AVLTree, right: AVLTree, } type AVLTree = Option>>; struct AVLTreeSet { root: AVLTree, } impl AVLTreeSet { pub fn new() -> Self { Self { root: None } } pub fn insert(&mut self, value: T) -> bool { let mut current_tree = &mut self.root; while let Some(current_node) = current_tree { match current_node.value.cmp(&value) { Ordering::Less => current_tree = &mut current_node.right, Ordering::Equal => return false, Ordering::Greater => current_tree = &mut current_node.left, } } *current_tree = Some(Box::new(AVLNode { value, left: None, right: None, })); true } } impl Ord for u32 { fn cmp(&self, other: &Self) -> Ordering { if *self < *other { Ordering::Less } else if *self == *other { Ordering::Equal } else { Ordering::Greater } } } fn main() { let mut tree = AVLTreeSet::new(); tree.insert(3); tree.insert(2); }