avl树 纯c实现,wa了第五到第十个点,求救
查看原帖
avl树 纯c实现,wa了第五到第十个点,求救
478387
ruojizzy楼主2022/3/29 17:04
#include <stdio.h>
#include <stdlib.h>
#define maxn 100005
typedef struct {
    int val;
    int l;
    int r;
    int height;
    int size;
}node;
node avl[maxn];
int count,root;
int max(int a,int b)
{
    return a>b?a:b;
}
void creat(int *now,int val)
{
    avl[*now=++count].val=val;
    avl[count].size=1;
}
void updata(int now)
{
    avl[now].height=max(avl[avl[now].l].height,avl[avl[now].r].height)+1;
    avl[now].size=avl[avl[now].l].size+avl[avl[now].r].size+1;
}
int get_df(int now)
{
    return avl[avl[now].l].height-avl[avl[now].r].height;
}
void lrorate(int *now)
{
    int r1=avl[*now].r;
    avl[*now].r=avl[r1].l;
    avl[r1].l=*now;
    updata(*now);
    updata(r1);
    *now=r1;
}
void rrotate(int *now)
{
    int l1=avl[*now].l;
    avl[*now].l=avl[l1].r;
    avl[l1].r=*now;
    updata(*now);
    updata(l1);
    *now=l1;
}
void check(int *now)
{
    int df=get_df(*now);
    if (df>1)
    {
        int df1=get_df(avl[*now].l);
        if (df1>0)//ll型
        {
            rrotate(now);
        }
        else
        {
            lrorate(&avl[*now].l);
            rrotate(now);
        }
    }
    else if (df<-1)
    {
        int df2=get_df(avl[*now].r);
        if (df2<0)
        {
            lrorate(now);
        }
        else
        {
            rrotate(&avl[*now].r);
            lrorate(now);
        }
    }
    else if (*now!=0) updata(*now);
}
void add(int *now,int val)
{
    if (*now==0)
        creat(now,val);
    else if (val>avl[*now].val) add(&avl[*now].r,val);
    else  add(&avl[*now].l,val);
    check(now);
}
int find(int now,int fa)
{
    int ans;
    if (avl[now].l==0)
    {
        ans=now;
        avl[fa].l=avl[now].r;
    }
    else
    {
        ans=find(avl[now].l,now);
        check(&now);
    }
    return ans;
}
void delete(int *now,int val)
{
    if (*now==0) return ;
    if (val<avl[*now].val) delete(&avl[*now].l,val);
    else if (val>avl[*now].val) delete(&avl[*now].r,val);
    else
    {
        int l=avl[*now].l;
        int r=avl[*now].r;
        if (!l||!r) *now=l+r;
        else
        {
            *now=find(r,r);
            if (*now!=r)
                avl[*now].r=r;
            avl[*now].l=l;
        }
    }
    check(now);
}
int getrank(int val)
{
    int rank=1;
    int now=root;
    while (now)
    {
        if (val<=avl[now].val)
            now=avl[now].l;
        else
        {
            rank+=avl[avl[now].l].size+1;
            now=avl[now].r;
        }
    }
    return rank;
}
int getnum(int rank)
{
    int now=root;
    while (now)
    {
        if (avl[avl[now].l].size+1==rank)
            break;
        else if (avl[avl[now].l].size+1<rank)
        {
            rank-=avl[avl[now].l].size+1;
            now=avl[now].r;
        }
        else    now=avl[now].l;
    }
    return avl[now].val;
}
int main()
{
    int n;
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        int op;
        int num;
        scanf("%d%d",&op,&num);
        switch (op){
            case 1: add(&root,num);
            break;
            case 2:delete(&root,num);
            break;
            case 3: printf("%d\n",getrank(num));
            break;
            case 4:printf("%d\n",getnum(num));
            break;
            case 5:printf("%d\n",getnum(getrank(num)-1));
            break;
            case 6:printf("%d\n",getnum(getrank(num+1)));
            break;
        }
    }
    return 0;
}

2022/3/29 17:04
加载中...