zoukankan      html  css  js  c++  java
  • 平衡二叉树—own版

    #include<iostream>
    using namespace std;
    const int LH=1;
    const int RH=-1;
    const int EH=0;
    struct BitNode
    {
        int data;
        int bf;
        BitNode *lchild,*rchild;
    };
    void L_Rotate(BitNode *&p)
    {
        BitNode *R=p->rchild;
        p->rchild=R->lchild;
        R->lchild=p;
        p=R;
    }
    void R_Rotate(BitNode *&p)
    {
        BitNode *L=p->lchild;
        p->lchild=L->rchild;
        L->rchild=p;
        p=L;
    }
    void LeftBalance(BitNode *&p)
    {
        BitNode *L,*Lr;
        L=p->lchild;
        switch(L->bf)
        {
            case LH://LL型 
                p->bf=L->bf=EH;
                R_Rotate(p);
                break;
            case RH://LR型 
                Lr=L->rchild;
                switch(Lr->bf)
                {
                    case LH://左子树右孩子的 左边
                          p->bf=RH;
                          L->bf=EH;
                          break;
                    case EH:
                          p->bf=L->bf=EH;
                          break;
                    case RH:
                          p->bf=EH;
                          L->bf=LH;
                          break;
                }
                Lr->bf=EH;
                L_Rotate(p->lchild);
                R_Rotate(p);
        }
     } 
    void RightBalance(BitNode *&p)//调整+更新 p 的平衡因子bf 
    {
        BitNode *R,*RL;
        R=p->rchild;
        switch(R->bf)
        {
            case RH://RR型 
                R->bf=p->bf=EH;
                L_Rotate(p);
                break;
            case LH://RL型 
                RL=R->lchild;
                switch(RL->bf)
                {
                    case LH://左子树右孩子的 左边
                          p->bf=EH;
                          R->bf=RH;
                          break;
                    case EH:
                          p->bf=R->bf=EH;
                          break;
                    case RH:
                          p->bf=LH;
                          R->bf=EH;
                          break;
                }
                RL->bf=EH;
                R_Rotate(p->rchild);
                L_Rotate(p);
        }
     }
    bool InsertAvl(BitNode *&p,int e,bool &taller)
    {
        if(p==NULL)
        {
            p=new BitNode();
            p->data=e;
            p->lchild=p->rchild=NULL;
            p->bf=EH;
            taller=true;
        }
        else
        {
            if(e==p->data)
            {
                taller=false;
                return false;
            }
            if(e<p->data)
            {
                if(!InsertAvl(p->lchild,e,taller))
                    return false;
                if(taller)
                {
                    switch(p->bf)
                    {
                        case LH://插入前P的状态(bf) 
                            LeftBalance(p);
                            taller=false;
                            break;
                        case EH:
                            p->bf=LH;
                            taller=true;
                            break;
                        case RH:
                            p->bf=EH;
                            taller=false;
                            break;
                    }
                }
            
            }
            else
            {
                if(!InsertAvl(p->rchild,e,taller))
                    return false;
                if(taller)
                {
                    switch(p->bf)
                    {
                        case LH:
                            p->bf=EH;
                            taller=false;
                            break;
                        case EH:
                            p->bf=RH;
                            taller=true;
                            break;
                        case RH:
                            RightBalance(p);
                            taller=false;
                            break;
                    }
                }
            }
        }
        return true;
     }
    print(const BitNode *p)
     {
         if(p!=NULL)
         {
             cout<<p->data;
             if(p->lchild!=NULL||p->rchild!=NULL)
             {
                 cout<<"(";
                 print(p->lchild);
                 if(p->rchild!=NULL)
                 {
                   cout<<",";
                   print(p->rchild);
                 }
                 cout<<")";
             }
         }
    } 
    int main()
    {
        int a[]={1,2,3,4,5,6,7,8,9,0,10};
        bool taller;
        BitNode *bt=NULL;
        for(int i=0;i<11;i++)
             InsertAvl(bt,a[i],taller);
        print(bt);
        cout<<endl;
        return 0;
    }

    --------------------- 
    作者:林凤g 
    来源:CSDN 
    原文:https://blog.csdn.net/fengyanglian/article/details/49637745 
    版权声明:本文为博主原创文章,转载请附上博文链接!
     
  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/shenyuling/p/10071944.html
Copyright © 2011-2022 走看看