因为number是从东到西填充,所以会构成一颗二叉排序树,且对应前序遍历。
用数组保存所有的节点,用parent和left,right保存节点间的连接关系。通过dfs构造树,再通过dfs查找对应的mail即可。
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include <ctype.h>
#include<map>
#include<time.h>
using namespace std;
//hdu 5444
const int maxn=1010;
int T;
int n;
class node
{
public:
int left;
int right;
int parent;
int val;
public:
node()
{
parent=0;
right=0;
left=0;
val=0;
}
};
int a[maxn];
int q;
int mail[maxn];
node leaf[maxn];
int cnt;
void add(int rt,int x)
{
if(cnt==1)//add the first leaf as root
{
leaf[rt].parent=rt;
leaf[rt].val=x;
leaf[rt].left=0;
leaf[rt].right=0;
cnt++;
// cout<<leaf[rt].parent<<" "<<leaf[rt].val<<" "<<leaf[rt].left<<" "<<leaf[rt].right<<endl;
return;
}
if(x<leaf[rt].val)
{
if(leaf[rt].right==0)//right is small number
{
leaf[rt].right=cnt;
leaf[cnt].parent=rt;
leaf[cnt].val=x;
leaf[cnt].left=0;
leaf[cnt].right=0;
// cout<<leaf[cnt].parent<<" "<<leaf[cnt].val<<" "<<leaf[rt].left<<" "<<leaf[rt].right<<endl;
cnt++;
return;
}
else
{
add(leaf[rt].right,x);
}
}
else if(x>leaf[rt].val)
{
if(leaf[rt].left==0)//left is large number
{
leaf[rt].left=cnt;
leaf[cnt].parent=rt;
leaf[cnt].val=x;
leaf[cnt].left=0;
leaf[cnt].right=0;
// cout<<leaf[cnt].parent<<" "<<leaf[cnt].val<<" "<<leaf[rt].left<<" "<<leaf[rt].right<<endl;
cnt++;
return;
}
else
{
add(leaf[rt].left,x);
}
}
}
void path(int rt,int x)
{
if(leaf[rt].val==x)
{
printf("\n");
return;
}
if(x<leaf[rt].val)
{
printf("E");
path(leaf[rt].right,x);
}
if(x>leaf[rt].val)
{
printf("W");
path(leaf[rt].left,x);
}
}
int main()
{
freopen("input.txt","r",stdin);
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
scanf("%d",&n);
cnt=1;
memset(leaf,0,sizeof(leaf));
memset(a,0,sizeof(a));
memset(mail,0,sizeof(mail));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
add(1,a[i]);
}
// for(int i=1;i<cnt;i++)
// {
// cout<<leaf[i].parent<<" "<<leaf[i].val<<" "<<leaf[i].left<<" "<<leaf[i].right<<endl;
// }
// cout<<endl;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d",&mail[i]);
path(1,mail[i]);
}
}
return 0;
}