AVL树板子RE求助
查看原帖
AVL树板子RE求助
1264607
Chean楼主2024/6/1 01:22

求助


平衡树板子,样例和前两个数据都过了,后面都RE了。 不懂为什么RE;求助

#include<bits/stdc++.h>
#define N 100005
#define amax 10000005
using namespace std;
struct Node{
    int value;
    int ch[2];
    int height;
    int size;//存储当前根节点所有节点的数量
}Tree[N];
int n;
int cnt = 0;
int diffh(int p){return Tree[Tree[p].ch[0]].height-Tree[Tree[p].ch[1]].height;}
void zs(int p){Tree[p].size=0;Tree[p].height=0;Tree[p].value=0;}
void deletP(int f,int p);
void deletP2(int f,int p,int xp);
void updatehs(int p){//更新节点高度和节点数量
    Tree[p].height=max(Tree[Tree[p].ch[0]].height,Tree[Tree[p].ch[1]].height)+1;
    Tree[p].size=Tree[Tree[p].ch[0]].size+Tree[Tree[p].ch[1]].size+1;
}
int transr(int p){
    int rt = Tree[p].ch[0];
    int newleft=Tree[rt].ch[1];
    Tree[rt].ch[1]=p;
    Tree[p].ch[0]=newleft;
    updatehs(p);
    updatehs(rt);
    return rt;
}
int transl(int p){
    int rt=Tree[p].ch[1];
    int newright=Tree[rt].ch[0];
    Tree[rt].ch[0]=p; 
    Tree[p].ch[1]=newright;
    updatehs(p);
    updatehs(rt);
    return rt; 
}
int findl(int p,int x,int nans){
    if(Tree[p].height==0)return nans;
    if(Tree[p].value>=x)findl(Tree[p].ch[0],x,nans);
    else nans=max(nans,Tree[p].value),findl(Tree[p].ch[1],x,nans);
}
int findr(int p,int x,int nans){
    if(Tree[p].height==0)return nans;
    if(Tree[p].value>x)nans=min(nans,Tree[p].value),findr(Tree[p].ch[0],x,nans);
    else findr(Tree[p].ch[1],x,nans);
}
void correct(int f,int p){
    int d=Tree[f].ch[0]==p?0:1;
    if(diffh(p)==2&&diffh(Tree[p].ch[0])==1)Tree[f].ch[d]=transr(p);
    if(diffh(p)==-2&&diffh(Tree[p].ch[1])==-1)Tree[f].ch[d]=transl(p);
    if(diffh(p)==2&&diffh(Tree[p].ch[0])==-1)Tree[p].ch[0]=transl(Tree[p].ch[0]),Tree[f].ch[d]=transr(p);
    if(diffh(p)==-2&&diffh(Tree[p].ch[1])==1)Tree[p].ch[1]=transr(Tree[p].ch[1]),Tree[f].ch[d]=transl(p);
}
void display(int a){
    if(a==0)return;
    display(Tree[a].ch[0]);
    printf("data: %d %d %d %d %d %d\n",a,Tree[a].value,Tree[Tree[a].ch[0]].value,Tree[Tree[a].ch[1]].value,Tree[a].height,Tree[a].size);
    display(Tree[a].ch[1]);
}
void insert(int f,int p,int d,int value){
    if(Tree[p].height==0){
        Tree[cnt].value=value;
        Tree[cnt].height=1;
        Tree[cnt].size=1;
        Tree[f].ch[d]=cnt;
        return; 
    }
    if(value>=Tree[p].value)insert(p,Tree[p].ch[1],1,value);
    else insert(p,Tree[p].ch[0],0,value);
    correct(f,p);
    updatehs(p);    
}
void deletP(int f,int p){
    int pl=Tree[p].ch[0];
    int pr=Tree[p].ch[1];
    int judge=(bool)pl+(bool)pr;
    int d=Tree[f].ch[0]==p?0:1;
    if(judge==0)Tree[f].ch[d]=0,zs(p);
    else if(judge==1)Tree[f].ch[d]=pl+pr,zs(p);
    else deletP2(p,Tree[p].ch[1],p);
    correct(f,p);
}
void deletP2(int f,int p,int xp){
    if(Tree[p].ch[0]!=0)deletP2(p,Tree[p].ch[0],xp);
    else Tree[xp].value=Tree[p].value,deletP(f,p);
    correct(f,p);
}
void delet(int f,int p,int x){
    if(Tree[p].value==x)deletP(f,p);
    else if(Tree[p].value>x)delet(p,Tree[p].ch[0],x);
    else delet(p,Tree[p].ch[1],x);
    correct(f,p);
}
int rankx(int p,int x){
    //printf("%d %d\n",p,Tree[Tree[p].ch[0]].size);
    if(p==0)return 1;
    if(x<Tree[p].value)return rankx(Tree[p].ch[0],x);
    else if(x>Tree[p].value)return 1+Tree[Tree[p].ch[0]].size+rankx(Tree[p].ch[1],x);
    else return Tree[p].size+1;
}
int rankr(int p,int rx,int nowrank){
    int rankp=nowrank+Tree[Tree[p].ch[0]].size+1;
    if(rx==rankp)return Tree[p].value;
    else if(rx<rankp)return rankr(Tree[p].ch[0],rx,nowrank);
    else return rankr(Tree[p].ch[1],rx,rankp);
}
int main(){
    Tree[0].ch[0]=1;
    scanf("%d",&n);
    int op,num;
    for(int i = 1;i<=n;i++){
        scanf("%d%d",&op,&num);
        switch (op){
        case 1:cnt++;insert(0,Tree[0].ch[0],0,num);break;
        case 2:delet(0,Tree[0].ch[0],num);break;
        case 3:printf("%d\n",rankx(Tree[0].ch[0],num));break;
        case 4:printf("%d\n",rankr(Tree[0].ch[0],num,0));break;
        case 5:printf("%d\n",findl(Tree[0].ch[0],num,-amax));break;
        case 6:printf("%d\n",findr(Tree[0].ch[0],num,amax));break;  
        default:break;
        }
    }
    system("pause");
    return 0;
}
2024/6/1 01:22
加载中...