平衡二叉树定义
AVL树也就是所谓的平衡二叉树,查找、删除、插入最坏情况下为O(log n),维持树的平衡只需要几次旋转即可。保证任意一个节点的左子树高度与右子树高度相差不大于1,默认树为空时高度为0。
节点结构
为了后续操作简洁性,先给出节点结构
final class node{
int value=0;//键值
int height=1;//节点高度
node left=null;//左右孩子
node right=null;
node(int value){
this.value=value;
}
}
旋转类型
维持平衡的操作就是树的旋转,旋转类型可以分为四种:
1.右旋LL类型
单个右旋,将k1的右子树作为k2的左子树,k2作为k1的右子树。该操作只是对于k1,k2进行,所以X,Y,X子树的高度不变,在旋转完成后,只需更新k1,k2高度即可
node l_l_rotate(node root){//LL旋转
node temp=root.left;//将左节点拿出来
root.left=temp.right;
temp.right=root;
root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新原root的height
root=temp;
root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新新root的height
return root;
}
简单说就是,将节点的左节点的右子树作为节点的左子树,节点作为其原来左节点的右子树。
2.左旋RR性
跟右转刚好反过来,k2的左子树作为k1的右子树,k1作为k2的左子树。跟上面一样,更改完成后,更新k1,k2的高度即可
node r_r_rotate(node root){//RR旋转
node temp=root.right;//将右节点拿出来
root.right=temp.left;
temp.left=root;
root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新原root的height
root=temp;
root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新新root的height
return root;
}
节点的右节点的左子树作为节点的右子树,节点作为其原来右节点的左子树。
3.先左旋再右旋LR