在计算机科学中,AVL树是一种自平衡的二叉搜索树,它通过在插入或删除节点后自动调整树结构来保持高度平衡,从而确保查找、插入和删除操作的时间复杂度始终为 O(log n)。本文将带你使用 Rust 语言 从零开始实现一个完整的 AVL 树,即使你是 Rust 新手,也能轻松理解。
AVL 树由 G.M. Adelson-Velsky 和 E.M. Landis 于 1962 年提出,是最早被发明的自平衡二叉搜索树之一。它的核心特性是:对于任意节点,其左右子树的高度差(称为“平衡因子”)的绝对值不超过 1。

在 Rust 中实现 AVL 树,我们需要考虑以下几点:
Option<Box<Node>> 表示子节点(避免空指针)首先,我们定义 AVL 树的节点结构。每个节点包含键(key)、值(value)、左右子树以及自身高度。
#[derive(Debug)]struct Node<K, V> { key: K, value: V, left: Option<Box<Node<K, V>>>, right: Option<Box<Node<K, V>>>, height: i32,}impl<K: Ord, V> Node<K, V> { fn new(key: K, value: V) -> Self { Node { key, value, left: None, right: None, height: 1, } } // 获取节点高度(None 视为高度 0) fn height_of(node: &Option<Box<Node<K, V>>>) -> i32 { node.as_ref().map_or(0, |n| n.height) } // 更新当前节点高度 fn update_height(&mut self) { let left_height = Self::height_of(&self.left); let right_height = Self::height_of(&self.right); self.height = 1 + left_height.max(right_height); }}AVL 树的关键在于旋转操作。当插入或删除导致不平衡时,我们需要通过旋转恢复平衡。以下是四种基本旋转:
impl<K: Ord, V> Node<K, V> { // 右旋(用于处理左子树过高) fn rotate_right(mut root: Box<Node<K, V>>) -> Box<Node<K, V>> { let mut new_root = root.left.take().unwrap(); root.left = new_root.right.take(); root.update_height(); new_root.right = Some(root); new_root.update_height(); new_root } // 左旋(用于处理右子树过高) fn rotate_left(mut root: Box<Node<K, V>>) -> Box<Node<K, V>> { let mut new_root = root.right.take().unwrap(); root.right = new_root.left.take(); root.update_height(); new_root.left = Some(root); new_root.update_height(); new_root } // 获取平衡因子 fn balance_factor(&self) -> i32 { Self::height_of(&self.left) - Self::height_of(&self.right) }}插入新节点后,我们需要递归向上检查并修复不平衡。这是 Rust AVL树实现 的核心逻辑。
impl<K: Ord, V> Node<K, V> { fn insert( node: Option<Box<Node<K, V>>>, key: K, value: V, ) -> Option<Box<Node<K, V>>> { match node { None => Some(Box::new(Node::new(key, value))), Some(mut root) => { if key < root.key { root.left = Self::insert(root.left, key, value); } else if key > root.key { root.right = Self::insert(root.right, key, value); } else { // 键已存在,更新值 root.value = value; return Some(root); } root.update_height(); Self::rebalance(root) } } } // 重新平衡树 fn rebalance(mut root: Box<Node<K, V>>) -> Option<Box<Node<K, V>>> { let bf = root.balance_factor(); // Left Left Case if bf > 1 && root.left.as_ref().unwrap().key > root.key { return Some(Self::rotate_right(root)); } // Right Right Case if bf < -1 && root.right.as_ref().unwrap().key < root.key { return Some(Self::rotate_left(root)); } // Left Right Case if bf > 1 { let left = root.left.take().unwrap(); root.left = Self::rotate_left(left); return Some(Self::rotate_right(root)); } // Right Left Case if bf < -1 { let right = root.right.take().unwrap(); root.right = Self::rotate_right(right); return Some(Self::rotate_left(root)); } Some(root) }}最后,我们将节点操作封装到一个 AVLTree 结构体中,提供更友好的 API。
pub struct AVLTree<K, V> { root: Option<Box<Node<K, V>>>,}impl<K: Ord, V> AVLTree<K, V> { pub fn new() -> Self { AVLTree { root: None } } pub fn insert(&mut self, key: K, value: V) { self.root = Node::insert(self.root.take(), key, value); } // 可继续添加 search、delete 等方法}通过本文,你已经掌握了如何用 Rust 实现一个基础但功能完整的 AVL 树。这不仅加深了你对 Rust数据结构教程 的理解,也让你熟悉了 AVL树旋转操作 的原理。虽然实际项目中可能直接使用标准库的 BTreeMap,但手动实现 AVL 树能极大提升你对算法和内存管理的认知。
如果你是初学者,建议多练习节点旋转的逻辑,并尝试添加删除(delete)功能——这是更具挑战性的部分!
希望这篇关于 Rust平衡二叉树 的教程对你有帮助!欢迎动手实践,写出属于你自己的高性能数据结构。
本文由主机测评网于2025-12-19发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210125.html