1. 程式人生 > >二叉搜索樹(模板)

二叉搜索樹(模板)

int ret class get name cnblogs clu space tin

#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); } }

二叉搜索樹(模板)