AVL 树概述
二叉搜索树虽然能提升查找效率,但在数据有序或接近有序时,会退化为单支树,导致查找效率降至 O(n)。为了解决这个问题,1962 年三位俄罗斯数学家提出了 AVL 树(Adelson-Velsky and Landis Tree),即平衡二叉搜索树。
AVL 树的核心在于通过严格的平衡因子控制树的高度。每个节点的左右子树高度之差的绝对值不超过 1。这使得树的高度始终保持在 O(log n),从而保证插入、删除和查找操作的时间复杂度均为 O(log n)。
核心概念
- 平衡因子 (bf):结点的左子树深度减去右子树深度。
- 性质:AVL 树中所有节点的平衡因子只能是 -1、0 或 1。
- 自平衡机制:当插入或删除节点破坏平衡时,通过旋转操作恢复结构。

如果一棵二叉搜索树是高度平衡的,它就是 AVL 树。例如按顺序插入 1,2,3,4,5,6,普通二叉搜索树会变成链表形态,而 AVL 树会通过旋转保持平衡,高度维持在 O(lgN)。

节点定义
AVL 树节点通常包含键值对、左右子节点指针、父节点指针以及平衡因子。
template <class K, class V>
struct AVLTreeNode {
AVLTreeNode<K, V>* _left;
AVLTreeNode<K, V>* _right;
AVLTreeNode<K, V>* _parent;
int _bf; // 平衡因子
pair<K, V> _kv;
AVLTreeNode(const pair<K, V>& kv)
: _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0), _kv(kv) {}
};
插入与平衡调整
AVL 树的插入过程分为三步:找到位置插入、更新平衡因子、必要时旋转。
平衡因子更新规则
插入新节点后,从父节点开始向上回溯更新祖先节点的平衡因子:
- 若插入在左子树:父节点 bf 减 1 (
parent->_bf--)。 - 若插入在右子树:父节点 bf 加 1 (
parent->_bf++)。
更新过程中会出现三种情况:






