题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5444
其实题目就是二叉树的先序遍历编号,然后以编好号后的中序遍历的顺序给出,叫我们再查询。
题目挺水的,但还是栽了,不能死板的用数组模拟二树,如果给出的数据全是在一个方向会 segment fault。
AC code:
#include<iostream>
#define debug(k) cout<<k<<endl
using namespace std;
struct node{
int va;
node *E,*W;
};
int array[1005];
node *head;
void built(int l,int r,node *p)
{
int mid=l;
node *t;
while(array[mid]<p->va&&mid<=r)mid++;
if(mid>l)
{
/*不能用p->E赋值给t,再给t申请新的空间,来改变p->E->va的值*/ ;
p->E=new node;
p->E->E=NULL;
p->E->W=NULL;
t=p->E;
t->va=array[l];
if(l+1<=mid-1)built(l+1,mid-1,t);
}
if(mid<=r)
{
p->W=new node;
p->W->E=NULL;
p->W->W=NULL;
t=p->W;
t->va=array[mid];
if(mid+1<=r)built(mid+1,r,t);
}
}
void search(int k)
{
node *t;
t=head;
while(t->va!=k&&t)
{
if(k<t->va)
{
cout<<"E";
t=t->E;
}
else
{
cout<<"W";
t=t->W;
}
}
cout<<endl;
}
int main()
{
int T,n;
while(cin>>T)
{
while(T--)
{
cin>>n;
head=NULL;
for(int i=1;i<=n;++i)
scanf("%d",&array[i]);
head=new node;
head->E=NULL;
head->W=NULL;
head->va=array[1];
built(2,n,head);
int m;
int t;
cin>>m;
for(int i=1;i<=m;++i)
{
scanf("%d",&t);
search(t);
}
}
}
}