1. AVL树与红黑树:平衡二叉树的两种实现
在计算机科学中,数据结构的选择往往决定了程序的性能。当我们需要高效地存储和检索有序数据时,二叉搜索树(BST)是一个常见的选择。然而,普通的BST在最坏情况下会退化为链表,导致操作时间复杂度从O(log n)恶化到O(n)。为了解决这个问题,计算机科学家们发明了多种自平衡二叉搜索树,其中最著名的就是AVL树和红黑树。
这两种数据结构都通过特定的平衡规则和旋转操作来保持树的平衡性,但它们采用了不同的平衡策略,导致了不同的性能特点。理解它们的内部工作原理和适用场景,对于开发者选择合适的数据结构至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AVL树:严格平衡的二叉搜索树
2.1 AVL树的基本概念
AVL树是最早发明的自平衡二叉搜索树,由Adelson-Velskii和Landis在1962年提出。它通过在BST的基础上增加平衡条件来确保树的高度始终保持在O(log n)级别。
AVL树的定义特性是:对于树中的每个节点,其左子树和右子树的高度差(称为平衡因子)绝对值不超过1。这个严格的平衡条件保证了AVL树在任何情况下都能保持近乎完美的平衡。
java复制class AVLTreeNode {
int val;
int height; // 节点高度
AVLTreeNode left;
AVLTreeNode right;
public AVLTreeNode(int val) {
this.val = val;
this.height = 1; // 新节点初始高度为1
}
}
2.2 AVL树的平衡维护
AVL树通过四种基本旋转操作来维护平衡:左旋、右旋、左右旋和右左旋。这些旋转操作在插入或删除节点后,当某个节点的平衡因子绝对值超过1时被触发。
2.2.1 左旋操作
左旋用于处理右子树过高的情况。下面是左旋的Java实现:
java复制private AVLTreeNode leftRotate(AVLTreeNode y) {
AVLTreeNode x = y.right;
AVLTreeNode T2 = x.left;
// 执行旋转
x.left = y;
y.right = T2;
// 更新高度
y.height = Math.max(height(y.left), height(y.right)) + 1;
x.height = Math.max(height(x.left), height(x.right)) + 1;
return x;
}
2.2.2 右旋操作
右旋用于处理左子树过高的情况:
java复制private AVLTreeNode rightRotate(AVLTreeNode x) {
AVLTreeNode y = x.left;
AVLTreeNode T2 = y.right;
// 执行旋转
y.right = x;
x.left = T2;
// 更新高度
x.height = Math.max(height(x.left), height(x.right)) + 1;
y.height = Math.max(height(y.left), height(y.right)) + 1;
return y;
}
2.3 AVL树的插入操作
AVL树的插入操作分为三个步骤:
- 执行标准的BST插入
2
