在计算机科学中,AVL树是一种自平衡的二叉搜索树,由 G.M. Adelson-Velsky 和 E.M. Landis 在1962年提出。它的核心特性是:任意节点的左右子树高度差不超过1。为了维持这一性质,AVL树在插入或删除节点后可能需要执行旋转操作。
本文将用通俗易懂的方式,结合 C# 代码,详细讲解 AVL树旋转操作 的四种类型,并帮助你掌握如何在 C# 中实现一个完整的平衡二叉树。无论你是编程小白还是有一定基础的开发者,都能轻松理解。
当我们向普通二叉搜索树(BST)中插入或删除节点时,树可能会变得“倾斜”,导致查找效率从理想的 O(log n) 退化为 O(n)。而 AVL 树通过在每次修改后检查并修复不平衡,始终保持高效性能。
当某个节点的平衡因子(左子树高度 - 右子树高度)绝对值大于1时,我们就说这棵树在该节点处“失衡”了,此时必须进行旋转来恢复平衡。

根据失衡节点与其子节点的相对位置,旋转分为以下四种:
首先,我们定义 AVL 树的节点结构和一些辅助方法:
public class AvlNode{ public int Value; public AvlNode Left; public AvlNode Right; public int Height; public AvlNode(int value) { Value = value; Height = 1; // 新节点高度为1 }}// 获取节点高度(空节点高度为0)private int GetHeight(AvlNode node){ return node == null ? 0 : node.Height;}// 更新节点高度private void UpdateHeight(AvlNode node){ if (node != null) { node.Height = 1 + Math.Max(GetHeight(node.Left), GetHeight(node.Right)); }}// 计算平衡因子private int GetBalanceFactor(AvlNode node){ return node == null ? 0 : GetHeight(node.Left) - GetHeight(node.Right);}当发生 LL 型失衡时,我们需要对失衡节点进行右旋:
private AvlNode RotateRight(AvlNode y){ AvlNode x = y.Left; AvlNode T2 = x.Right; // 执行旋转 x.Right = y; y.Left = T2; // 更新高度(注意顺序:先更新y,再更新x) UpdateHeight(y); UpdateHeight(x); return x; // 新的根节点}RR 型失衡则需要左旋:
private AvlNode RotateLeft(AvlNode x){ AvlNode y = x.Right; AvlNode T2 = y.Left; // 执行旋转 y.Left = x; x.Right = T2; // 更新高度 UpdateHeight(x); UpdateHeight(y); return y; // 新的根节点}这两种情况是前两种的组合:
在插入或删除后的平衡函数中,我们会根据平衡因子自动判断使用哪种旋转:
private AvlNode Balance(AvlNode node){ if (node == null) return node; UpdateHeight(node); int balance = GetBalanceFactor(node); // LL 型 if (balance > 1 && GetBalanceFactor(node.Left) >= 0) return RotateRight(node); // RR 型 if (balance < -1 && GetBalanceFactor(node.Right) <= 0) return RotateLeft(node); // LR 型 if (balance > 1 && GetBalanceFactor(node.Left) < 0) { node.Left = RotateLeft(node.Left); return RotateRight(node); } // RL 型 if (balance < -1 && GetBalanceFactor(node.Right) > 0) { node.Right = RotateRight(node.Right); return RotateLeft(node); } return node;}最后,我们将旋转逻辑整合到插入方法中:
public AvlNode Insert(AvlNode node, int value){ // 1. 执行标准 BST 插入 if (node == null) return new AvlNode(value); if (value < node.Value) node.Left = Insert(node.Left, value); else if (value > node.Value) node.Right = Insert(node.Right, value); else return node; // 不允许重复值 // 2. 更新当前节点高度 UpdateHeight(node); // 3. 检查是否失衡并旋转 return Balance(node);}通过以上步骤,我们实现了 C# 平衡二叉树 的核心——旋转操作。掌握这四种旋转是理解 AVL树实现 的关键。在实际开发中,AVL 树适用于频繁查询、较少插入/删除的场景,如数据库索引、内存中的有序字典等。
希望这篇 C#数据结构教程 能帮助你彻底搞懂 AVL 树的旋转机制!动手写一遍代码,你会理解得更深刻。
本文由主机测评网于2025-12-09发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025125234.html