|
5#
楼主 |
发表于 2020-4-13 19:44:37
|
只看该作者
1、读懂题目之后做了一组1-20的二十个数的数据,准备把它每个数都查询一次,翻转一次,插入交换一次,求下位置,准备验算,因为这中题目联调会非常头疼,有必要在写的时候保证每个函数的正确性,否则一旦出错,调试将是可怕的。
2、因为是SPLAY,所以前面的ArrayPr,BSTPr()等函数还是写着,毕竟还不敢保证一写就能对。
3、初始状态不用SPLAY插入方式来做,因为旋转过多可能不好,采用类似线段树的递归建树模式。建成后打印时候打印输出,
- #include<bits/stdc++.h>
- using namespace std;
- const int N=80100;
- struct node
- {
- int val,fa,s[2],sz; ///s0s1左右儿子
- } a[N];
- int p[N],n,m, tot, root;
- void ArrayPr() /// 调试监视使用
- {
- cout<<endl<<" i ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<i;
- cout<<endl<<"val ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].val;
- cout<<endl<<" s0 ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].s[0];
- cout<<endl<<" s1 ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].s[1];
- cout<<endl<<" sz ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].sz;
- cout<<endl<<" fa ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].fa;
- cout<<endl;
- }
- void BSTPr(int rt) ///中序输出以rt为根的BST
- {
- if (a[rt].s[0]>0) BSTPr(a[rt].s[0]);
- cout<<a[rt].val<<' ';
- if (a[rt].s[1]>0) BSTPr(a[rt].s[1]);
- }
- int Build(int l,int r) ///前n个数直接建个满二叉树
- {
- if (l>r) return 0;
- if (l==r)
- {
- a[l].val=p[l];
- a[l].sz=1;
- return l;
- }
- int m=(l+r)/2;
- a[m].val=p[m];
- int L=a[m].s[0]=Build(l,m-1);
- int R=a[m].s[1]=Build(m+1,r);
- a[L].fa=a[R].fa=m;
- a[m].sz=a[L].sz+a[R].sz+1;
- return m;
- }
- int main()
- {
- cin>>n;
- for (int i=1; i<=n; i++)cin>>p[i];
- tot=n;
- root=Build(1,n);
- ///初始建树完毕
- ArrayPr();
- BSTPr(root);
-
- return 0;
- }
- /*
- 20
- 1 3 2 7 5 8 10 4 9 6
- 11 13 12 17 15 18 14 19 16 20
- */
复制代码 |
|