首页 > 代码库 > 二叉搜索树
二叉搜索树
刚学,只简单地写了。处理的比较幼稚,待改进。
#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; }
二叉搜索树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。