传送门
题目大意
给你一个序列,第一个数为二叉树根节点,之后每个数往上加节点,且保证左节点小于根节点,且保证右节点大于根节点。且每个节点最多有2个子节点。然后再查询位置,每往左找输出一个E,右找输出W。
思路
按照给定的序列建树查找即可
代码
int n;
struct node{
int l;
int r;
int val;
}tree[maxn];
int tot;
void init(int tot){
tree[tot].l=tree[tot].r=-1;
}
void build(int root,int val){
if(tree[root].l!=-1&&tree[root].val>val){
build(tree[root].l,val);
}
else if(tree[root].r!=-1&&tree[root].val<val){
build(tree[root].r,val);
}
else{
init(tot);
tree[tot].val=val;
if(val<tree[root].val) tree[root].l=tot;
else tree[root].r=tot;
tot++;
}
}
void query(int root,int val){
if(tree[root].val==val){//找到了
printf("\n");
return ;
}
if(val<tree[root].val){//向左找
printf("E");
query(tree[root].l,val);
}
else {//向右找
printf("W");
query(tree[root].r,val);
}
}
int v[maxn];
int main(){
int t;
cin>>t;
while(t--){
scanf("%d",&n);
tot=1;
for(int i=1;i<=n;i++){
scanf("%d",&v[i]);
if(i==1){//根节点
init(tot);
tree[tot].val=v[i];
tot++;
}
else{
build(1,v[i]);
}
}
int q;
scanf("%d",&q);
while(q--){
int val;
scanf("%d",&val);
query(1,val);
}
}
}