AVL树本质上还是一颗二叉搜索树,它满足以下特点:
1.其本身是一颗二叉搜索树。
2.左右子树的高度之差的绝对值小于等于1.
AVL树失衡如何处理?
情况1:在一个节点的左子树的左子树下插入一个新结点,即LL,在这种情况下,应该做如下处理:
将K1的右子树挂到K2的左子树下(K2->left = K1->right)
将K2挂在K1的右子树下(K1->right=K2)
需要注意的是高度也发生了变化!需要注意的是高度也发生了变化,每颗树高度计算为:取左右子树高的那棵树,在将高的那棵树的高度+1就是要求的树的高度。
情况2:在一个节点的右子树的右子树下插入一个新节点,即RR,在这种情况下,应做如下处理:
将K2的左子树挂在K1的右子树下(K1->RIGHT=K2->LEFT)
将K1挂在K2的左子树下(K2->LEFT=K1);
需要注意的是高度也发生了变化,每颗树高度计算为:取左右子树高的那棵树,在将高的那棵树的高度+1就是要求的树的高度。
情况3:RL类型的失衡
先进行LL旋转,再进行RR旋转。需要注意的是找准失衡的节点。
图中K3节点失衡,先将其进行LL旋转。
旋转之后K2节点失衡,在对K2进行RR旋转。
情况4:LR类型的失衡
找到失衡的节点A,先将其进行LL旋转。
再找到失衡的节点B,将其进行RR旋转。