3374 数据结构实验之查找二:平衡二叉树

数据结构实验之查找二:平衡二叉树

#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
struct node  
{  
    int ndata;             //记录关键字数值  
    node *l,*r;  
    int nheight;           //平衡因子  
};  
int height(node* p)        //返回树p的深度  
{  
    if(p==NULL)  
    return -1;  
    return p->nheight;  
}  
node* LLRotate(node* p)     //对LL型直接在不平衡结点进行左旋转  
{  
    node* p1;  
    p1=p->l;  
    p->l=p1->r;  
    p1->r=p;  
    p->nheight=max(height(p->l),height(p->r))+1;  //结点的位置变了,要更新结点的高度值  
    p1->nheight=max(height(p1->l),p->nheight)+1;  
    return p1;  
}  
node* RRRotate(node* p)   //对RR型直接在不平衡结点进行右旋转  
{  
    node* p1;  
    p1=p->r;  
    p->r=p1->l;  
    p1->l=p;  
    p->nheight=max(height(p->l),height(p->r))+1;  
    p1->nheight=max(height(p1->r),p->nheight)+1;  
    return p1;  
}  
node* LRRotate(node* p)  
{  
    p->l=RRRotate(p->l);   //在不平衡结点p的左儿子处进行右旋转  
    return LLRotate(p);    //在不平衡结点p处进行左旋转并返回新的根  
}  
node* RLRotate(node* p)  
{  
    p->r=LLRotate(p->r);   //在不平衡结点p的右儿子处进行左旋转  
    return RRRotate(p);    //在不平衡结点p处进行左旋转并返回新的根  
}  
node* _Insert(int s,node* p)  
{  
    if(p==NULL)            //待插入的值赋给新开辟的结点  
    {  
        p=new node;  
        p->ndata=s;  
        p->nheight=0;  
        p->l=p->r=NULL;  

    }  
    else if(s<p->ndata)    //若待插入的值小于p的关键字数值,则插入到左子树中  
    {  
        p->l=_Insert(s,p->l);  
        if(height(p->l)-height(p->r)==2)   //该树出现不平衡  
        {  
            if(s<p->l->ndata)      //若待插入的值插到了左儿子的左子树上则单旋转  
                p=LLRotate(p);  
            else                   //反之,双旋转  
                p=LRRotate(p);  
        }  
    }  
    else if(s>p->ndata)     //道理同上  
    {  
        p->r=_Insert(s,p->r);  
        if(height(p->l)-height(p->r)==-2)  
        {  
            if(s>p->r->ndata)  
                p=RRRotate(p);  
            else  
                p=RLRotate(p);  
        }  
    }  
    p->nheight=max(height(p->l),height(p->r))+1;  
    return p;  
}  
int main()  
{  
    int n;  
    while(~scanf("%d",&n))  
    {  
        node *head=NULL;  
        while(n--)  
        {  
            int x;  
            scanf("%d",&x);  
            head=_Insert(x,head);  
        }  
        printf("%d\n",head->ndata);  
    }  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值