AVL树是一种自平衡二叉搜索树,它的每个节点都存储一个平衡因子,用于保持树的平衡。在插入和删除节点时,AVL树会自动进行旋转操作,以保持树的平衡。
AVL树的插入操作分为四种情况:
1.左子树的高度比右子树的高度要大2或更多,且插入节点在左子树的左子树上。这种情况下,需要进行一次右旋操作。 2.左子树的高度比右子树的高度要大2或更多,且插入节点在左子树的右子树上。这种情况下,需要进行一次左旋操作,再进行一次右旋操作。 3.右子树的高度比左子树的高度要大2或更多,且插入节点在右子树的右子树上。这种情况下,需要进行一次左旋操作。 4.右子树的高度比左子树的高度要大2或更多,且插入节点在右子树的左子树上。这种情况下,需要进行一次右旋操作,再进行一次左旋操作。
AVL树的删除操作也需要进行旋转操作以维护平衡。删除节点后,从它的父节点开始,向上递归,检测平衡因子是否被破坏,如果破坏了平衡因子,则进行旋转操作。
以下是一个用Java实现的AVL树的示例代码:
class AVLNode{
int val;
int height;
AVLNode left;
AVLNode right;
public AVLNode(int v){
val = v;
height = 1;
}
}
class AVLTree{
AVLNode root;
public AVLTree(){
root = null;
}
private int height(AVLNode node){
if (node == null) return 0;
else return node.height;
}
private int balanceFactor(AVLNode node){
return height(node.left) - height(node.right);
}
private void updateHeight(AVLNode node){
node.height = Math.max(height(node.left), height(node.right)) + 1;
}
private AVLNode rightRotate(AVLNode y){
AVLNode x = y.left;
AVLNode T2 = x.right;
x.right = y;
y.left = T2;
updateHeight(y);
updateHeight(x);
return x;
}
private AVLNode leftRotate(AVLNode x){
AVLNode y = x.right;
AVLNode T2 = y.left;
y.left = x;
上一篇:AVL树单旋转函数
下一篇:AVL树的删除函数无法正常工作。