还没有写删除操作,所以感觉实用性不大 操作含义如图所示
#include <cstdio> #include <iostream> using namespace std; int tot=1; int root=1; struct tree{ int val; int lt; int rt; int size; int fat; }; tree a[99999]; int num; void insert(int t,int v)//插入 { if(!t) return; if(v>a[t].val) { if(!a[t].rt) { a[++tot].val=v; a[tot].size=1; a[t].rt=tot; a[tot].fat=t; } else insert(a[t].rt,v); } else { if(!a[t].lt) { a[++tot].val=v; a[tot].size=1; a[t].lt=tot; a[tot].fat=t; } else insert(a[t].lt,v); } a[t].size=a[a[t].lt].size+a[a[t].rt].size+1; } int check1(int t,int k) { int b=0; while(1) { if(a[a[t].lt].size==k-(1+b)) break; if(a[a[t].lt].size>k-1) t=a[t].lt; else { b+=a[a[t].lt].size+1; t=a[t].rt; } } return a[t].val; } int check2(int t,int k) { int b=0; while(1) { if(a[t].val==k) break; if(a[t].val>k) t=a[t].lt; else { b+=a[a[t].lt].size+1; t=a[t].rt; } } return a[a[t].lt].size+1+b; } int check3(int t,int k) { int fat; while(1) { if(a[t].val==k) return a[t].val; if(a[t].val<k) { if(a[t].rt) fat=t,t=a[t].rt; else return a[fat].val; } if(a[t].val>k) { if(a[t].lt) fat=t,t=a[t].lt; else return a[t].val; } } } int main() { int n; scanf("%d",&n); int x,y; scanf("%d%d",&x,&y); a[1].val=y; a[1].size=1; for(int i=2;i<=n;i++) { scanf("%d%d",&x,&y); if(x==1) { insert(1,y); } if(x==3) { printf("%d\n",check1(1,y)); } if(x==4) { printf("%d\n",check2(1,y)); } if(x==5) { printf("%d\n",check3(1,y)); } if(x==6) { int k=check2(1,y); printf("%d\n",check1(1,k-1)); } if(x==7) { int k=check2(1,y); printf("%d\n",check1(1,k+1)); } } return 0; }