二叉搜索树
刚学,只简单地写了。处理的比较幼稚,待改进。
递归 ,版慢一点
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; struct tree{ int key;//域值 int l;//编号 int lm;//左长 int r; int rm; int f;//编号 }a[999999]; int root=0,tot=0; void add(int x,int now) { if(a[now].lm ==0&&x<a[now].key ) { a[++tot].key=x; a[now].l=tot; a[tot].f=now; a[now].lm++; return ; } if(a[now].rm ==0&&x>=a[now].key ) { a[++tot].key=x; a[now].r=tot; a[tot].f=now; a[now].rm++; return ; } //if(x==a[now].key) return ; if(x<a[now].key) add(x,a[now].l),a[now].lm++;else if(x>=a[now].key) add(x,a[now].r),a[now].rm++; return ; } void balance() { while(a[root].lm >a[root].rm+tot/4) { a[root].f=a[root].l; a[a[root].l ].r=root; root=a[root].l; }else while(a[root].lm <=a[root].rm+tot/4) { a[root].f=a[root].r; a[a[root].r ].l=root; root=a[root].r; } return ; } void delet(int x) { int now=findw(x); if(now==root) { if(a[now].lm >a[now].rm ) { a[a[root].l].r=a[root].r; root=a[root].l; } } } int find3(int x,int now) { if(a[now].lm ==x-1) return a[now].key ; if(a[now].lm >x-1) return find3(x,a[now].l ); if(a[now].lm<x-1) return find3(x-a[now].lm-1,a[now].r ); } int find4(int x,int now) { if(a[now].key==x) return a[now].lm+1; if(x<a[now].key) return find4(x,a[now].l); if(x>a[now].key) return find4(x,a[now].r)+a[now].lm+1; } int find5(int x,int now) { int w=a[now].key ; if(w==x) return w; if(w>x) { if(a[now].lm ==0) return w; return find5(x,a[now].l ); } if(w<x) { if(a[now].rm ==0) return a[a[now].f ].key; return find5(x,a[now].r ); } } int findw(int x,int now) { if(a[now].key==x) return now; if(x<a[now].key) return findw(x,a[now].l); if(x>a[now].key) return findw(x,a[now].r); } int find6(int x) { int now=findw(x,root); if(a[now].lm!=0) return a[a[now].l].key; return a[a[now].f].key; } int find7(int x) { int now=findw(x,root); if(a[now].rm!=0) return a[a[now].r].key; return a[a[now].f].key; } int main() { int p,x,n; int pp[20],z[20]; root=0,tot=0; cin>>n; for(int i=1;i<=n;i++) scanf("%d%d",&pp[i],&z[i]); for(int i=1;i<=n;i++) { p=pp[i];x=z[i]; if(p==1) { if(tot==0) a[++tot].key=x,root=tot; else add(x,root); } if(p==3) printf("%d\n",find3(x,root)); if(p==4) printf("%d\n",find4(x,root)); if(p==5) printf("%d\n",find5(x,root)); if(p==6) printf("%d\n",find6(x)); if(p==7) printf("%d\n",find7(x)); } return 0; }
迭代快一些吧。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; struct tree{ int key;//域值 int l;//编号 int lm;//左长 int r; int rm; int f;//编号 }a[999999]; int root=0,tot=0; void add(int x,int now) { if(a[now].lm ==0&&x<a[now].key ) { a[++tot].key=x; a[now].l=tot; a[tot].f=now; a[now].lm++; return ; } if(a[now].rm ==0&&x>=a[now].key ) { a[++tot].key=x; a[now].r=tot; a[tot].f=now; a[now].rm++; return ; } //if(x==a[now].key) return ; if(x<a[now].key) add(x,a[now].l),a[now].lm++;else if(x>=a[now].key) add(x,a[now].r),a[now].rm++; return ; } void balance() { while(a[root].lm >a[root].rm+tot/4) { a[root].f=a[root].l; a[a[root].l ].r=root; root=a[root].l; } while(a[root].lm <=a[root].rm+tot/4) { a[root].f=a[root].r; a[a[root].r ].l=root; root=a[root].r; } return ; } int findw(int x,int now) { while(a[now].key !=x) { if(x<a[now].key) now=a[now].l;else if(x>a[now].key) now=a[now].r; } return now; } void delet(int x) { int now=findw(x,root); if(now==root) { if(a[now].lm >a[now].rm ) { a[a[root].l].r=a[root].r; root=a[root].l; } } } void find3(int x,int now)//查询第x个数 { while(a[now].lm!=x-1) { if(a[now].lm >x-1) now=a[now].l;else if(a[now].lm<x-1) x=x-a[now].lm-1,now=a[now].r ; } printf("%d\n",a[now].key ); return ; } void find4(int x,int now)//查询x的排名 { int ans=0; while(a[now].key!=x) { if(x<a[now].key) now=a[now].l;else if(x>a[now].key ) now=a[now].r,ans+=a[now].lm+1; } printf("%d\n",a[now].lm+1+ans); return ; } int find5(int x,int now)//不小于x的最小元素 { int w=a[now].key ; if(w==x) return w; if(w>x) { if(a[now].lm ==0) return w; return find5(x,a[now].l ); } if(w<x) { if(a[now].rm ==0) return a[a[now].f ].key; return find5(x,a[now].r ); } } int find6(int x)//前驱 { int now=findw(x,root); if(a[now].lm!=0) return a[a[now].l].key; return a[a[now].f].key; } int find7(int x)//后驱 { int now=findw(x,root); if(a[now].rm!=0) return a[a[now].r].key; return a[a[now].f].key; } int main() { int p,x,n; int pp[20],z[20]; root=0,tot=0; cin>>n; for(int i=1;i<=n;i++) scanf("%d%d",&pp[i],&z[i]); for(int i=1;i<=n;i++) { p=pp[i];x=z[i]; if(p==1) { if(tot==0) a[++tot].key=x,root=tot; else add(x,root); } if(p==3) find3(x,root); if(p==4) find4(x,root); if(p==5) printf("%d\n",find5(x,root)); if(p==6) printf("%d\n",find6(x)); if(p==7) printf("%d\n",find7(x)); } return 0; }