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

    #include<stdio.h>
    #include<stdlib.h>
    
    #define LH 1//左高
    #define EH 0//等高
    #define RH -1//右高
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    
    typedef int ElemType;
    typedef int Status;
    typedef int Boolean;
    
    typedef struct BSTNode{
        ElemType data;
        int bf;//节点的平衡因子
        struct BSTNode *lchild,*rchild;
    }BSTNode,*BSTree;
    
    void R_Rotate(BSTree &p);
    void L_Rotate(BSTree &p);
    void LeftBalance(BSTree &T);
    void RightBalance(BSTree &T);
    Status InsertAVL(BSTree &T,ElemType e,Boolean &taller);
    void PreOrderTraverse(BSTree p);
    
    int main()
    {
        BSTree T=NULL;
        int n,m;
        Boolean taller;
        printf("输入二叉树节点数:");
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&m);
            InsertAVL(T,m,taller);
        }
        PreOrderTraverse(T);
        return 0;
    }
    
    Status InsertAVL(BSTree &T,ElemType e,Boolean &taller)
    {
        if(!T)
        {
            T=(BSTNode*)malloc(sizeof(BSTNode));
            if(!T)exit(0);
            T->data=e;
            T->lchild=T->rchild=NULL;
            taller=TRUE;
            T->bf=EH;
        }
        else
        {
            if(e==T->data)//子树没有增长
            {
                taller=FALSE;
                return FALSE;
            }
            else if(e<T->data)
            {
                if(InsertAVL(T->lchild,e,taller))
                    if(taller)
                    {
                        switch (T->bf)
                        {
                        case LH:
                            LeftBalance(T);
                            taller=FALSE;
                            break;
                        case EH:
                            T->bf=LH;
                            taller=TRUE;
                            break;
                        case RH:
                            T->bf=EH;
                            taller=FALSE;
                            break;
                        }
    
                    }
            }
            else
            {
                if(InsertAVL(T->rchild, e, taller))
                    if(taller)
                    {
                        switch(T->bf)
                        {
                        case LH:
                            T->bf = EH;
                            taller = FALSE;
                            break;
    
                        case EH:
                            T->bf = RH;
                            taller = TRUE;
                            break;
    
                        case RH:
                            RightBalance(T);
                            break;
                        }
                    }
            }
        }
        return OK;
    }
    
    void LeftBalance(BSTree &T)
    {
        BSTree lc,rd;
        lc=T->lchild;
        switch (lc->bf)//因为要平衡,所以平衡因子不可能为0
        {
        case LH:
            T->bf=lc->bf=EH;
            R_Rotate(T);
            break;
        case RH:
           T->bf=lc->bf=EH;
           L_Rotate(T->lchild);
           R_Rotate(T);
        }
    
    }
    
    void RightBalance(BSTree &T)
    {
        BSTree rc,ld;
        rc=T->rchild;
        switch (rc->bf)
        {
        case LH:
            ld=rc->lchild;
            T->bf=rc->bf=ld->bf;
            R_Rotate(T->rchild);
            L_Rotate(T);
            break;
        case RH:
            T->bf=rc->bf=EH;
            L_Rotate(T);
            break;
        }
    
    }
    
    void R_Rotate(BSTree &p)
    {
        BSTree rc;
        rc=p->lchild;
        p->lchild=rc->rchild;
        rc->rchild=p;
        p=rc;
    }
    
    void L_Rotate(BSTree &p)
    {
        BSTree lc;
        lc=p->rchild;
        p->rchild=lc->lchild;
        lc->lchild=p;
        p=lc;
    }
    
    void PreOrderTraverse(BSTree p)
    {
        if(p)
        {
            printf("%d ",p->data);
            PreOrderTraverse(p->lchild);
            PreOrderTraverse(p->rchild);
        }
    }
    


  • 相关阅读:
    Python3---filter,map,reduce
    老男孩-day2作业-计算器
    Python 简易购物系统--老男孩作业
    老男孩-day1作业二
    老男孩-day1作业一
    Axure8.0图片旋转注意
    CentOS6.5部署KVM及实现在线迁移
    CentOS 6.5 安装部署iSCSi共享存储
    CentOS 6.5 安装部署KVM
    CentOS6.5部署L2TP over IPSec
  • 原文地址:https://www.cnblogs.com/gaot/p/7709711.html
Copyright © 2011-2022 走看看