首页 > 代码库 > 二叉搜索树(模板)

二叉搜索树(模板)

#include<cstdio>
using namespace std;
const int M=9999;
struct tr{
	int l,r,x,size,num,f;
}a[M]; 
int tot=1; 
void insert(int v,int u){    
    if(!v)return;    
    if(u>a[v].x)
	{    
        if(!a[v].r)
		{    
            a[++tot].x=u;    
            a[tot].f=v;   
			a[tot].size=1;
            a[v].r=tot;    
               
        }
		else insert(a[v].r,u);             
    }
	else{    
        if(!a[v].l)
		{    
            a[++tot].x=u;    
            a[tot].size=1;
            a[tot].f=v;    
            a[v].l=tot;        
        }
		else insert(a[v].l,u);     
    }   
	a[v].size=a[a[v].l].size+a[a[v].r].size+1;
}  
/*int ins(int t,int v,int l,int r){
	
	if(!s[l].key)
	s[t].l=newcode(v);
	else if(s[l].key>v&&!s[r].key) s[t].r=newcode(v);
	else if(v<s[l].key){
		ins(l,v,s[l].l,s[l].r);
	}
	else if(){
	
		ins(s[t].r,v);
	}
	s[t].size=s
}*/
int getmax(int t){
	while(a[t].r!=0){
		t=a[t].r;
	}
	return t;
}
int check(int t,int k){
	if(a[a[t].l].size==k-1)
	return a[t].x;
	if(a[a[t].l].size>k-1)
	{
		return check(a[t].l,k);
	}
	else{
		return check(a[t].r,k-a[a[t].l].size-1);
	}
}
int check2(int t,int k,int ans){
	if(a[t].x==k){
		
		return ans+a[a[t].l].size;
	}
	if(a[t].x>k){
		return check2(a[t].l,k,ans);
	}
	else return check2(a[t].r,k,ans+a[a[t].l].size+1);

}
int check3(int t,int k){
	if(a[t].x==k){
		
		return k;
	}
	if(a[t].x>k){
		if(!a[a[t].l].x)return a[t].x;
		return check3(a[t].l,k);
	}
	if(a[t].x<k){
		if(!a[a[t].r].x)return a[t].x;
		return check3(a[t].r,k);
	}
	
}
/*int check4(int t,int k,int ans){
	if(a[t].x==k){
		
		check();
	}
	if(a[t].x>k){
		return check2(a[t].l,k,ans);
	}
	else return check2(a[t].r,k,ans+a[a[t].l].size+1);

}*/
int n;
int main(){
	scanf("%d",&n);

	for(int i=1;i<=n;i++){
		int q,y;
		scanf("%d%d",&q,&y);
		if(i==1)
		{
			a[1].x=y;
			a[1].size=1;
			continue;
		}
		if(q==1){
			insert(1,y);
		}
		if(q==2){
			
		}
		if(q==3)
		printf("%d\n",check(1,y));
		if(q==4)
		printf("%d\n",check2(1,y,1));
		if(q==5){
			printf("%d\n",check3(1,y)); 
		}
		if(q==6)
		{
			int k=check2(1,y,1);
			printf("%d\n",check(1,k-1));
		}
		if(q==7)
		{
			int k=check2(1,y,1);
			printf("%d\n",check(1,k+1));
		}
	}
	for(int i=1;i<=tot;i++){
	//	printf("%d \n",a[i].size);
	}
}

  

#include<cstdio>
using namespace std;
const int M=9999;
struct tr{
    int l,r,x,size,num,f;
}a[M]; 
int tot=1; 
void insert(int v,int u){    
    if(!v)return;    
    if(u>a[v].x)
    {    
        if(!a[v].r)
        {    
            a[++tot].x=u;    
            a[tot].f=v;   
            a[tot].size=1;
            a[v].r=tot;    
               
        }
        else insert(a[v].r,u);             
    }
    else{    
        if(!a[v].l)
        {    
            a[++tot].x=u;    
            a[tot].size=1;
            a[tot].f=v;    
            a[v].l=tot;        
        }
        else insert(a[v].l,u);     
    }   
    a[v].size=a[a[v].l].size+a[a[v].r].size+1;
}  
/*int ins(int t,int v,int l,int r){
    
    if(!s[l].key)
    s[t].l=newcode(v);
    else if(s[l].key>v&&!s[r].key) s[t].r=newcode(v);
    else if(v<s[l].key){
        ins(l,v,s[l].l,s[l].r);
    }
    else if(){
    
        ins(s[t].r,v);
    }
    s[t].size=s
}*/
int getmax(int t){
    while(a[t].r!=0){
        t=a[t].r;
    }
    return t;
}
int check(int t,int k){
    if(a[a[t].l].size==k-1)
    return a[t].x;
    if(a[a[t].l].size>k-1)
    {
        return check(a[t].l,k);
    }
    else{
        return check(a[t].r,k-a[a[t].l].size-1);
    }
}
int check2(int t,int k,int ans){
    if(a[t].x==k){
        
        return ans+a[a[t].l].size;
    }
    if(a[t].x>k){
        return check2(a[t].l,k,ans);
    }
    else return check2(a[t].r,k,ans+a[a[t].l].size+1);

}
int check3(int t,int k){
    if(a[t].x==k){
        
        return k;
    }
    if(a[t].x>k){
        if(!a[a[t].l].x)return a[t].x;
        return check3(a[t].l,k);
    }
    if(a[t].x<k){
        if(!a[a[t].r].x)return a[t].x;
        return check3(a[t].r,k);
    }
    
}
/*int check4(int t,int k,int ans){
    if(a[t].x==k){
        
        check();
    }
    if(a[t].x>k){
        return check2(a[t].l,k,ans);
    }
    else return check2(a[t].r,k,ans+a[a[t].l].size+1);

}*/
int n;
int main(){
    scanf("%d",&n);

    for(int i=1;i<=n;i++){
        int q,y;
        scanf("%d%d",&q,&y);
        if(i==1)
        {
            a[1].x=y;
            a[1].size=1;
            continue;
        }
        if(q==1){
            insert(1,y);
        }
        if(q==2){
            
        }
        if(q==3)
        printf("%d\n",check(1,y));
        if(q==4)
        printf("%d\n",check2(1,y,1));
        if(q==5){
            printf("%d\n",check3(1,y)); 
        }
        if(q==6)
        {
            int k=check2(1,y,1);
            printf("%d\n",check(1,k-1));
        }
        if(q==7)
        {
            int k=check2(1,y,1);
            printf("%d\n",check(1,k+1));
        }
    }
    for(int i=1;i<=tot;i++){
    //    printf("%d \n",a[i].size);
    }
}

 

二叉搜索树(模板)