/*
*调整节点的平衡
*
* 入口参数 :a 为最小不平衡因子 ; t 用于存放新的树根
*/
void Rotate(AVLTree *t,AVLTree a) /*
{ * 本人写的此封装旋转的函数包括了六种旋转情况
AVLTree b; * 如下六种:
if(a->bf==2) * A(RR型) A(RL型)
{ * / / / / |
b=a->lchild; * # B # B
if(b->bf==1) * / / / /
{ * # # C #
*t=LL_Rotate(a); * / /
} * # #
else *
{ *
*t=LR_Rotate(a); * A(LL型) A(LR型)
} * / / / /
}//左边不平衡的时候 * B # B #
Else * / / / /
{ * # # # C
b=a->rchild; * / /
if(b->bf==1) * # #
{ *
*t=RL_Rotate(a); *
} * A (RL型) A(LR型)
Else * / / / /
{ * # B B #
*t=RR_Rotate(a); * / / / /
} * # # # #
}//右边不平衡的时候 【上述插入或删除在B左孩子】 【上述插入或删除在B左孩子】
} *
*/
说明:本人本来是没有留意的,仅仅认为有四种。而现在可以清晰的描述上述6种情况,完全是在调试平衡二叉排序树删除节点时候发现的,所以非常的高兴,虽然书上描述四种,但是可以包括六种情况。此函数可以屏蔽旋转,不需要特别的判断,这里特别指出,是因为此函数特别好用,非常方便,希望老师可以满意。