理解 AVL、Treap、Splay 等自平衡树核心的左旋与右旋操作,维持树的高效平衡状态
在二叉搜索树(BST)中,如果插入的数据接近有序,树的结构会退化成一个单向链表,导致检索复杂度从最优秀的 $O(\log N)$ 恶化为慢速的 $O(N)$。为了维护树的高度平衡,自平衡树(如 AVL 树)会在检测到失衡时,执行核心的旋转(Rotation)操作:
struct Node {
int val;
Node* left;
Node* right;
};
// 1. 左单旋 (Left Rotate)
Node* leftRotate(Node* A) {
Node* B = A->right;
Node* T2 = B->left;
// 旋转重组
B->left = A;
A->right = T2;
return B; // 返回新的局部根节点 B
}
// 2. 右单旋 (Right Rotate)
Node* rightRotate(Node* B) {
Node* A = B->left;
Node* T2 = A->right;
// 旋转重组
A->right = B;
B->left = T2;
return A; // 返回新的局部根节点 A
}