在计算机科学中,AVL树是一种自平衡的二叉搜索树(BST),由 G.M. Adelson-Velsky 和 E.M. Landis 在1962年提出。它通过确保任意节点的左右子树高度差不超过1来维持树的平衡,从而保证查找、插入和删除操作的时间复杂度始终为 O(log n)。
本教程将带你从零开始,使用Java语言一步步实现一个完整的AVL树,并解释其中的关键概念。无论你是初学者还是有一定基础的开发者,都能轻松掌握这个重要的数据结构教程内容。
普通的二叉搜索树在最坏情况下(如插入已排序的数据)会退化成链表,导致操作时间复杂度变为 O(n)。而自平衡二叉搜索树如AVL树能自动调整结构,始终保持平衡,避免性能下降。
下面我们用Java编写一个完整的AVL树类,包含节点定义、插入、旋转和高度计算等方法。
class AVLNode { int key; AVLNode left; AVLNode right; int height; public AVLNode(int key) { this.key = key; this.height = 1; // 新节点初始高度为1 }} public class AVLTree { private AVLNode root; // 获取节点高度 private int height(AVLNode node) { if (node == null) return 0; return node.height; } // 更新节点高度 private void updateHeight(AVLNode node) { if (node != null) { node.height = Math.max(height(node.left), height(node.right)) + 1; } } // 计算平衡因子 private int getBalance(AVLNode node) { if (node == null) return 0; return height(node.left) - height(node.right); }} 旋转是AVL树保持平衡的关键:
// 右旋 private AVLNode rotateRight(AVLNode y) { AVLNode x = y.left; AVLNode T2 = x.right; // 执行旋转 x.right = y; y.left = T2; // 更新高度 updateHeight(y); updateHeight(x); return x; // 新的根节点 } // 左旋 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; // 新的根节点 } 插入后检查平衡并进行必要的旋转:
public void insert(int key) { root = insertRec(root, key); } private AVLNode insertRec(AVLNode node, int key) { // 1. 执行标准BST插入 if (node == null) { return new AVLNode(key); } if (key < node.key) { node.left = insertRec(node.left, key); } else if (key > node.key) { node.right = insertRec(node.right, key); } else { // 不允许重复键 return node; } // 2. 更新当前节点的高度 updateHeight(node); // 3. 获取平衡因子 int balance = getBalance(node); // 4. 如果不平衡,进行旋转 // Left Left Case if (balance > 1 && key < node.left.key) { return rotateRight(node); } // Right Right Case if (balance < -1 && key > node.right.key) { return rotateLeft(node); } // Left Right Case if (balance > 1 && key > node.left.key) { node.left = rotateLeft(node.left); return rotateRight(node); } // Right Left Case if (balance < -1 && key < node.right.key) { node.right = rotateRight(node.right); return rotateLeft(node); } // 返回未改变的节点指针 return node; } public class Main { public static void main(String[] args) { AVLTree tree = new AVLTree(); tree.insert(10); tree.insert(20); tree.insert(30); tree.insert(40); tree.insert(50); tree.insert(25); // 此时树已自动平衡 System.out.println("AVL树构建完成!"); }} 通过本教程,你已经掌握了AVL树的基本原理和Java AVL树实现方法。这种自平衡二叉搜索树是许多高级数据结构(如红黑树)的基础,在数据库索引、内存管理等领域有广泛应用。
建议你动手实践上述代码,尝试添加删除操作,加深对这一重要数据结构教程内容的理解。祝你在学习数据结构的道路上越走越远!
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129072.html