zoukankan      html  css  js  c++  java
  • 平衡二叉树的调整模版

    typedef struct avltreenode *avltree;
    typedef struct avltreenode{
        int data;
        avltree left;
        avltree right;
        int height;
    };
    
    int getheight(avltree a)
    {
        if(a==NULL) return -1;
        return a->height;
    }
    
    //a必须有一个左子结点b
    //a与b做左单旋,更新a与b高度,返回新的根结点b
    avltree singleleftrotation(avltree a)
    {
        avltree b=a->left;
        a->left=b->right;
        b->right=a;
        a->height=max(getheight(a->left),getheight(a->right))+1;
        b->height=max(getheight(b->left),a->height)+1;
    
        return b;
    }
    
    //右单旋
    avltree singlerightrotation(avltree a)
    {
        avltree b=a->right;
        a->right=b->left;
        b->left=a;
    
        a->height=max(getheight(a->left),getheight(a->right))+1;
        b->height=max(getheight(b->right),a->height)+1;
    
        return b;
    }
    
    //左右双旋
    //a必须有一个左子结点b,且b必须有一个右子结点c
    //a,b,c,做两次单旋,返回新的根结点c
    //先对b和c做右单旋,在对a和c做左单旋
    avltree doubleleftrightrotation(avltree a)
    {
        a->left=singlerightrotation(a->left);
    
        return singleleftrotation(a);
    }
    
    //右左双旋
    avltree doublerightleftrotation(avltree a)
    {
        a->right=singleleftrotation(a->right);
    
        return singlerightrotation(a);
    }
    
    avltree avl_insertion(int x,avltree t)
    {
        /*将X插入avl树T中,并返回调整后的avl树*/
        if(!t)/*插入空树,则新建包含一个结点的树*/
        {
            t=(avltree)malloc(sizeof(struct avltreenode));
            t->data=x;
            t->height=0;
            t->left=t->right=NULL;
        }/*插入空树结束*/
        else if(x<t->data)
        {
            t->left=avl_insertion(x,t->left);
            if(getheight(t->left)-getheight(t->right)==2)
            {
                /*需要左旋*/
                if(x<t->left->data)
                    t=singleleftrotation(t);//左单旋 singleleftrotation
                else
                    t=doubleleftrightrotation(t);//左右双旋
            }
        }
        else if(x>t->data)
        {
            t->right=avl_insertion(x,t->right);
            if(getheight(t->left)-getheight(t->right)==-2)
            {
                /*需要右旋*/
                if(x>t->right->data)
                    t=singlerightrotation(t);//右单旋
                else
                    t=doublerightleftrotation(t);//右左双旋
            }
        }
    
        //x=data,无须插入
        t->height=max(getheight(t->left),getheight(t->right))+1;
        return t;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    JVM的即时编译器JIT之简单介绍
    JS脚本动态给标签控件添加事件
    getParameterMap的使用
    IOS开发中判断文件是否存在,不存在则拷贝
    javaweb中解决Cookie中文乱码问题
    网页中的上标和下标实现
    Java中枚举的使用
    ASP.NET 首页性能的4大做法
    httpHandlers和httpModules接口介绍 (5)
    css+div排版如何支持所有浏览器
  • 原文地址:https://www.cnblogs.com/xryz/p/4847951.html
Copyright © 2011-2022 走看看