|
板凳
楼主 |
发表于 2020-3-22 10:59:44
|
只看该作者
- #include<bits/stdc++.h>
- using namespace std;
- const int mm=100;
- struct AA
- {
- int val,cnt;
- int ls,rs;
- } a[mm],ta;
- int tot;/// 有效节点总数
- void ArrayPr()
- {
- for (int i=1; i<=tot; i++) cout<<setw(3)<<i;
- cout<<endl;
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].val;
- cout<<endl;
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].cnt;
- cout<<endl;
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].ls;
- cout<<endl;
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].rs;
- cout<<endl;
- }
- void BSTPr(int rt) ///中序输出以rt为根的BST
- {
- if (a[rt].ls>0) BSTPr(a[rt].ls);
- cout<<a[rt].val<<' '; /// 也可以加上cnt
- if (a[rt].rs>0) BSTPr(a[rt].rs);
- }
- void BSTIns(int & rt,int x) ///在以rt为根的BST中传插入x
- {
- if (rt==0) ///新建
- {
- rt=++tot;
- a[tot].val=x;
- a[tot].cnt=1;
- a[tot].ls=a[tot].rs=0;
- }
- else if (a[rt].val==x)a[rt].cnt++;
- else if (a[rt].val<x) BSTIns(a[rt].rs,x);
- else if (a[rt].val>x) BSTIns(a[rt].ls,x);
- }
- int findx(int rt,int x)
- {
- if (rt==0) return 0;
- else if (a[rt].val==x) return rt;
- else if (a[rt].val<x) return findx(a[rt].rs,x);
- else if (a[rt].val>x) return findx(a[rt].ls,x);
- }
- int rank(int x)
- {
- }
- AA DelMin(int & rt) ///删除rt为根的树里的最小结点 并返回这个结点的val值
- {
- AA t;
- if (a[rt].ls==0) ///没有左儿子,它就是最小,准备删除
- {
- t.val=a[rt].val,t.cnt=a[rt].cnt;t.ls=t.rs=0;
- rt=a[rt].rs; ///右儿子接上了
- return t;
- }
- else return DelMin(a[rt].ls);
- }
- void BSTDel(int & rt,int x) ///在rt子树中删除x
- {
- if (rt==0) return ;
- else if (a[rt].val>x) BSTDel(a[rt].ls,x);
- else if (a[rt].val<x) BSTDel(a[rt].rs,x);
- else if (a[rt].cnt>1) a[rt].cnt--;
- else if (a[rt].ls==0) rt=a[rt].rs; /// 要不要考虑将右儿子清0
- else if (a[rt].rs==0) rt=a[rt].ls;
- else ///右子树的最小值接上来
- {
- a[rt].val=DelMin(a[rt].rs).val;
- a[rt].cnt=DelMin(a[rt].rs).cnt;
- }
- }
- int main()
- {
- int x, rt=1;
- cin>>x;
- while (x>0)
- {
- BSTIns(rt,x); ///以rt为根节点
- cin>>x;
- }
- cout<<tot<<endl;
- ArrayPr();
- cout<<rt<<' ';
- BSTPr(rt);
- cout<<endl<<findx(rt,1); ///找到1
- }
- /*
- 50 25 75 18 38 66 80 10 16 26 40 62 68 79 90 9 12 15 30 42 93 8 14 41 43 95 6 44 94 99 5 7 0
- */
复制代码 |
|