平衡二叉树

来源:互联网 发布:台湾 香港 知乎 编辑:程序博客网 时间:2024/06/16 19:23

ACM模版

构建平衡二叉树

#define LH 1#define EH 0#define RH -1//  结点typedef struct BiTNode{    int data;    int bf;    struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;//  右旋void R_Rotate(BiTree *p){    BiTree L;    L = (*p)->lchild;    (*p)->lchild = L->rchild;    L->rchild = (*p);    *p = L;    return ;}//  左旋void L_Rotate(BiTree *p){    BiTree L;    L = (*p)->rchild;    (*p)->rchild = L->lchild;    L->lchild = (*p);    *p = L;    return ;}//  左边深旋转void LeftBalance(BiTree *T){    BiTree L, Lr;    L = (*T)->lchild;    switch (L->bf)    {        case LH:            (*T)->bf = L->bf = EH;            R_Rotate(T);            //  右旋即可            break;        case RH:            Lr = L->rchild;            switch (Lr->bf)            {                case LH:                    (*T)->bf = RH;                    L->bf = EH;                    break;                case EH:                    (*T)->bf = L->bf = EH;                    break;                case RH:                    (*T)->bf = EH;                    L->bf = LH;                    break;            }            Lr->bf = EH;            L_Rotate(&(*T)->lchild);//  先左旋            R_Rotate(T);            //  后右旋            break;    }    return ;}//  右边深旋转void RightBalance(BiTree *T){    BiTree L, Ll;    L = (*T)->rchild;    switch (L->bf)    {        case RH:            (*T)->bf = L->bf = EH;            L_Rotate(T);            //  左旋即可            break;        case LH:            Ll = L->lchild;            switch (Ll->bf)            {                case LH:                    (*T)->bf = RH;                    L->bf = EH;                    break;                case EH:                    (*T)->bf = L->bf = EH;                    break;                case RH:                    (*T)->bf = EH;                    L->bf = LH;                    break;            }            Ll->bf = EH;            R_Rotate(&(*T)->rchild);//  先右旋            L_Rotate(T);            //  后左旋            break;    }    return ;}//  插入AVL结点bool InsertAVL(BiTree *T, int e, bool *taller){    if (!*T)    {        *T = (BiTree)malloc(sizeof(BiTNode));        (*T)->data = e;        (*T)->lchild = (*T)->rchild = NULL;        (*T)->bf = EH;        *taller = true;    }    else    {        if (e == (*T)->data)    //  已经存在e        {            *taller = false;            return false;        }        if (e < (*T)->data)     //  小于data向左递归        {            if (!InsertAVL(&(*T)->lchild, e, taller))            {                return false;            }            switch ((*T)->bf)            {                case LH:    //  左边深,插入前需要旋转                    LeftBalance(T);                    *taller = false;                    break;                case EH:    //  平衡,插入后变为左边深                    (*T)->bf = LH;                    break;                case RH:    //  右边深,插入后变为平衡                    (*T)->bf = EH;                    *taller = false;                    break;            }        }        else                    //  大于data向右递归        {            if (!InsertAVL(&(*T)->rchild, e, taller))            {                return false;            }            switch ((*T)->bf)            {                case LH:    //  左边深,插入后变为平衡                    (*T)->bf = EH;                    *taller = false;                    break;                case EH:    //  平衡,插入后变为右边深                    (*T)->bf = RH;                    break;                case RH:    //  右边深,插入前需要旋转                    RightBalance(T);                    *taller = false;                    break;            }        }    }    return *taller;}
0 0
原创粉丝点击