您的位置:首页 > 其它

AVLTree旋转实现

2011-01-02 22:05 169 查看
/*
*调整节点的平衡
*
* 入口参数 :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种情况,完全是在调试平衡二叉排序树删除节点时候发现的,所以非常的高兴,虽然书上描述四种,但是可以包括六种情况。此函数可以屏蔽旋转,不需要特别的判断,这里特别指出,是因为此函数特别好用,非常方便,希望老师可以满意。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c