AVL 树

自平衡二叉搜索树。任意节点左右子树高度差不超过 1。查找/插入/删除均为 O(log n)。


结构定义

typedef struct AVLNode {
    int key;
    int height;        /* 节点高度(叶子为 1) */
    struct AVLNode *left;
    struct AVLNode *right;
} AVLNode;

函数签名

函数复杂度说明
AVLNode* avl_insert(AVLNode *root, int key)O(log n)插入,自底向上旋转修复
AVLNode* avl_delete(AVLNode *root, int key)O(log n)删除,自底向上旋转修复
AVLNode* avl_search(AVLNode *root, int key)O(log n)查找

旋转操作

四种失衡情况

失衡类型旋转条件
LL(左左)右旋左子树高度 - 右子树高度 > 1,且插入发生在左子树的左子树
RR(右右)左旋右子树高度 - 左子树高度 > 1,且插入发生在右子树的右子树
LR(左右)左旋 + 右旋左重且插入发生在左子树的右子树
RL(右左)右旋 + 左旋右重且插入发生在右子树的左子树

右旋 (RR→平衡)

AVLNode* rotate_right(AVLNode *y) {
    AVLNode *x = y->left;
    AVLNode *T2 = x->right;
    x->right = y;
    y->left = T2;
    y->height = 1 + max(height(y->left), height(y->right));
    x->height = 1 + max(height(x->left), height(x->right));
    return x;
}

平衡因子

BF = height(left) - height(right)
  • BF ∈ {-1, 0, 1}:平衡
  • BF = 2:左重,需右旋或先左旋再右旋
  • BF = -2:右重,需左旋或先右旋再左旋

AVL vs 红黑树

特性AVL 树红黑树
平衡条件严格(高度差 ≤ 1)宽松(最长 ≤ 2×最短)
查找更快(更平衡)稍慢
插入/删除旋转次数多旋转次数少(≤ 3)
实现复杂度中等较高

跨语言参考