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 
    版权声明:本文为博主原创文章,转载请附上博文链接!
     
  • 相关阅读:
    java读取文件并获得文件编码,转换为指定编码的工具类代码
    OpenStreetMap地图数据介绍(转)
    字符串匹配的KMP算法(转)
    Dijkstra算法求最短路径(java)(转)
    用java解析在OpenStreetMap上下载的地图数据(SAX版,适合比较大的xml文件)
    用java解析在OpenStreetMap上下载的地图数据
    加载依赖的jar包在命令行编译和运行java文件
    CentOS 加载/挂载 U盘 (转)
    MongoDB:如何正常关闭服务(转)
    JTS(Geometry)(转)
  • 原文地址:https://www.cnblogs.com/shenyuling/p/10071944.html
Copyright © 2011-2022 走看看