题意:对于一个堆,找出从根节点出发到某一个点的行走的路径
输入:第一行数据组数T,每一组第1行元素个数n,第2行各个元素,第3行询问个数,第4行询问元素。
输出:每一询问元素打印出由"E","W”组成的字符串,若所查询节点就是根节点,则输出一个空行
For instance, the sequence 2, 1, 4, 3 would be written on the root of the following tree.
Sample Input
2
4
2 1 4 3
3
1 2 3
6
6 5 4 3 2 1
1
1
Sample Output
E
WE
EEEEE
就是一道暴力模拟堆的题目,需要注意的是处理每组数据都要重置树的各个节点,还有插入时的一些细节。
这里我用的是数组进行模拟,下面就是代码。
#include <iostream> #include <cstdio> using namespace std; const int MAXN=1010; struct pt { int l,r; pt(int l=-1,int r=-1):l(l),r(r){} }p[MAXN]; int qr[MAXN]; int rt; void ph(int k) { int t=rt; while(t!=-1) { if(p[t].l==-1&&t>k) { p[t].l=k; break; } if(p[t].r==-1&&t<k) { p[t].r=k; break; } t = k<t? p[t].l:p[t].r; } } void find(int k) { int t=rt; while(k!=t) { if(k>t) printf("W"),t=p[t].r; else if(k<t) printf("E"),t=p[t].l; } printf(" "); } int main() { int t,q; cin>>t; while(t--) { for(int i=1;i<MAXN;++i) //重置节点 p[i].l=p[i].r=-1; int n,k; cin>>n; for(int i=1;i<=n;++i) { scanf("%d",&k); if(i==1) rt=k; ph(k); } cin>>q; for(int i=1;i<=q;++i) scanf("%d",&qr[i]); for(int i=1;i<=q;++i) find(qr[i]); } return 0; }