AVL树:
-
AVL树是良好平衡的,在一颗AVL树中,每个结点的子树的高度差距为0或者1。可以得出一个AVL树的最大高度为O(log n)。
-
平衡因子:右子树的高度减去左子树的高度。
-
左偏重:如果结点的平衡因子为-1 或更小。
-
右偏重:如果结点的平衡因子为+1 或更大。
-
旋转:一个结点重新获得平衡的过程,有4 种可能的旋转:LL、RR、LR、RL。
-
LL旋转:以下情况使用LL旋转
-
RR旋转:以下情况使用RR旋转
-
LR旋转:以下情况使用LR旋转
-
RL旋转:以下情况使用RL旋转
AVL是二叉搜索树,将AVLTree设计为BST的子类:
- 旋转的实现
-LL旋转算法:
private void balanceLL(TreeNode<E> A, TreeNode parentOfA) {
TreeNode<E> B = A.left;
if (A == root) {
root = B;
}
else {
if (parentOfA.left == A) {
parentOfA.left = B;
}
else {
parentOfA.right = B;
}
}
A.left = B.right;
B.right = A;
updateHeight((AVLTreeNode<E>)A);
updateHeight((AVLTreeNode<E>)B);
}
-RR旋转算法:
private void balanceRR(TreeNode<E> A, TreeNode parentOfA) {
TreeNode<E> B = A.left;
if (A == root) {
root = B;
}
else {
if (parentOfA.left == A) {
parentOfA.left = B;
}
else {
parentOfA.right = B;
}
}
A.right = B.left;
B.right = A;
updateHeight((AVLTreeNode<E>)A);
updateHeight((AVLTreeNode<E>)B);
}
-LR旋转算法:
private void balanceLR(TreeNode<E> A, TreeNode parentOfA) {
TreeNode<E> B = A.left;
TreeNode<E> C = B.right;
if (A == root) {
root = C;
}
else {
if (parentOfA.left == A) {
parentOfA.left = C;
}
else {
parentOfA.right = C;
}
}
A.left = C.right;
B.right = C.left;
C.left = B;
C.right = A;
updateHeight((AVLTreeNode<E>)A);
updateHeight((AVLTreeNode<E>)B);
updateHeight((AVLTreeNode<E>)C);
}
-RL旋转算法:
private void balanceRL(TreeNode<E> A, TreeNode parentOfA) {
TreeNode<E> B = A.right;
TreeNode<E> C = B.left;
if (A == root) {
root = C;
}
else {
if (parentOfA.left == A