我有一个
AVL Tree in Java的实现,经过了很好的测试,如果你想用它作为参考.它基于维基百科的描述,并且评论很好.
就像在常规BST插入后必须平衡时一样.您可以像BST一样删除节点,然后根据以下算法进行平衡.
BST删除后进行平衡的情况是(节点是用于替换已删除节点的节点的父节点):
... remove code ...
// Re-balance the tree all the way up the tree
while (nodeToRefactor != null) {
nodeToRefactor.updateHeight();
balanceAfterDelete(nodeToRefactor);
nodeToRefactor = (AVLNode) nodeToRefactor.parent;
}
... remove code ...
... balance code ...
int balanceFactor = node.getBalanceFactor();
if (balanceFactor==-2 || balanceFactor==2) {
if (balanceFactor==-2) {
AVLNode ll = (AVLNode) node.lesser.lesser;
int lesser = ll.height;
AVLNode lr = (AVLNode) node.lesser.greater;
int greater = lr.height;
if (lesser>=greater) {
rightRotation(node);
} else {
leftRotation(node.lesser);
rightRotation(node);
}
} else if (balanceFactor==2) {
AVLNode rr = (AVLNode) node.greater.greater;
int greater = rr.height;
AVLNode rl = (AVLNode) node.greater.lesser;
int lesser = rl.height;
if (greater>=lesser) {
leftRotation(node);
} else {
rightRotation(node.greater);
leftRotation(node);
}
}
}