二叉搜索树在理想情况下查找效率很高,但一旦退化成单链,复杂度会降到 O(N)。

1962 年,Adelson-Velskii 和 Landis 提出了 AVL 树——通过保证任意节点左右子树高度差不超过 1,让树始终保持近乎完全二叉树的形态,从而将高度控制在 O(log N)。
map 和 set 的底层之一就是 AVL 树(另一个常见的是红黑树)。如果数据是静态的,或者读多写少,AVL 树是很划算的选择。
AVL 树的定义就两条:
- 左右子树都是 AVL 树
- 左右子树高度差(平衡因子)的绝对值不超过 1

每次插入、删除后通过旋转来修正平衡,保证树的高度稳定在 O(log N),搜索也就稳在 O(log N)。
节点与树的结构
在普通二叉搜索树节点的基础上,AVL 树节点多了两个成员:
_bf(平衡因子):右子树高度减去左子树高度。插入左边时_bf--,插入右边时_bf++。_parent:指向父节点的指针,用于向上回溯更新平衡因子。
template<class K, class V>
struct AVLTreeNode {
pair<K, V> _kv;
AVLTreeNode* _left;
AVLTreeNode* _right;
AVLTreeNode* _parent;
int _bf;
AVLTreeNode(const pair<K, V>& kv)
: _kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0) {}
};
template<class K, class V>
class AVLTree {
using Node = AVLTreeNode<K, V>;
private:
Node* _root = nullptr;
};










