zoukankan      html  css  js  c++  java
  • AVL平衡二叉树实现

    #include<stdio.h>
    #include<stdlib.h>
    
    #define TRUE 1
    #define FALSE 0
    #define EH 0
    #define LH 1
    #define RH -1
    //平衡二叉树的节点结构
    typedef struct BiTNode{
        int data;
        int bf;//平衡因子
        BiTNode *lchld,*rchild;
    }BiTNode,*BiTree;
    
    typedef int Status;
    //LL调整
    void R_Rotate(BiTree &T)
    {
        BiTree p;
        p=T->lchild;
        T->lchild=p->rchild;
        p->rchild=T;
        T=p;
    }
    //RR调整
    void L_Rotate(BiTree &T)
    {
        BiTree p;
        p=T->rchild;
        T->rchild=p->lchild;
        p->lchild=T;
        T=p;
    }
    //左平衡处理LL,LR
    void LeftBalance(BiTree &T)
    {
        BiTree L,LR;
        L=T->lchild;
        switch(L->bf) 
        {
            case 0:
                L->bf=-1;
                T->bf=1;
                R_Rotate(T);
                break;
            case 1:
                L->bf=T->bf=0;
                R_Rotate(T);
                break;
            case -1:
                LR=L->rchild;
                switch(LR->bf)
                {
                    case 0:
                        L->bf=T->bf=0;
                    case -1:
                        T->bf=0;
                        L->bf=1;
                        break;
                    case 1:
                        L->bf=0;
                        T->bf=-1;
                        break;
                    default:
                        break;
                }
                LR->bf=0;
                L_Rotate(T->lchild);
                R_Rotate(T);
                break;
            default:
                break;
        }
    }
    //右平衡处理RR,RL
    void RightBalance(BiTree &T)
    {
        BiTree R,RL;//调用函数,T为根,右边高于左边T->bf=-1;
        R=T->rchild;//R是T的右孩子
        switch(R->bf)
        {
            case -1://如果T时右孩子和T它们的平衡因子相同,直接左旋。
                T->bf=R->bf=0;
                L_Rotate(T);
                break;
            case 0:
                T->bf=-1;
                R->bf=1;
                L_Rotate(T);
                break;
            case 1:
                RL=R->lchild;
                switch(RL->bf)
                {
                    case 0:
                        T->bf=R->bf=0;
                        break;
                    case -1:
                        R->bf=0;
                        T->bf=1;
                        break;
                    case 1:
                        R->bf=-1;
                        T->bf=0;
                        break;
                    default:
                        break;
                }
                RL->bf=0;
                R_Rotate(T->rchild);
                L_Rotate(T);
                break;
        }
    }
    
    bool InsertAVLTree(BiTree &T,int key,bool taller)
    {
        if(!T)//T为空
        {
            T=(BiTree)malloc(sizeof(BiTNode));
            T->bf=0;
            T->lchild=T->rchild=NULL;
            T->data=key;
            taller=true;
            return true;
        }
        else
        {
            if(key==T->data)//已经存在key相同的元素,不用插入,返回false
            {
                taller=false;
                return false;
            }
            if(key<T->data)//所插入的元素小于根的值,找他的左孩子比较
            {
                if(!InsertAVLTree(T->lchild,key,taller))
                {
                    return false;
                }
                if(taller)
                {
                    switch(T->bf)
                    {
                        case 0:
                            T->bf=1;
                            taller=true;
                            break;
                        case 1:
                            LeftBalance(T);
                            taller=false;
                            break;
                        case -1:
                            T->bf=0;
                            taller=false;
                            break;
                        default:
                            break;
                    }
                }
                else
                {
                    if(!InsertAVLTree(T->rchild,key,taller))
                    {
                        return false;
                    }
                    if(taller)
                    {
                        switch(T->bf)
                        {
                            case 0:
                                T->bf=-1;
                                taller=true;
                                break;
                            case 1:
                                T->bf=0;
                                taller=false;
                                break;
                            case -1:
                                RightBalance(T);
                                taller=false;
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
        }
    }
  • 相关阅读:
    NYOJ70 阶乘因式分解(二)
    HDOJ4519 郑厂长系列故事——体检
    c/s网络编程
    HDOJ4535 吉哥系列故事——礼尚往来
    HDOJ4505 小Q系列故事——电梯里的爱情
    顺序图/序列图试验
    协作图实验
    HDOJ4530 小Q系列故事——大笨钟
    HDOJ4515 小Q系列故事——世界上最遥远的距离(日期问题)
    Web上传文件的原理及实现
  • 原文地址:https://www.cnblogs.com/drq1/p/9430960.html
Copyright © 2011-2022 走看看