题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5444
题目大意:给出一颗二叉树的先序遍历,默认的中序遍历是1.、2、……n。给出q个询问,询问从根节点出发到某个点的路径。
思路:根据二叉树的先序和中序遍历可以建立出一颗二叉树,然后遍历二叉树查找即可。
如何遍历?因为中序遍历是从小到大的,所以左子树<根<右子树。根据这个遍历即可。
代码:
#include<stdio.h>
#include<string.h>
struct node {
int l,r,val;
}tree[100005];
int tot=1;
void init(int tot)
{
tree[tot].l=tree[tot].r=0;
}
void insert(int x,int val)
{
if(tree[x].l&&val<tree[x].val)insert(tree[x].l,val); //如果左子树存在,插入到左子树
else if(tree[x].r&&val>tree[x].val)insert(tree[x].r,val); //如果右子树存在,插入到右子树
else {
init(tot);
tree[tot].val=val;
if(tree[x].val>val)tree[x].l=tot;
else tree[x].r=tot;
tot++;
}
}
void query(int x,int val)
{
if(val==tree[x].val){printf("\n");return;}
if(tree[x].val>val){ //如果当前值小于根,那么往左子树找
printf("E");
query(tree[x].l,val);
}
else { //往右子树找
printf("W");
query(tree[x].r,val);
}
}
int main()
{
int T,i,j,k,n,a[1005],b[1005],q,x;
scanf("%d",&T);
while(T--)
{
tot=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i==1){
init(tot);
tree[tot].val=a[i];
tot++;
}
else insert(1,a[i]);
}
scanf("%d",&q);
while(q--)
{
scanf("%d",&x);
query(1,x);
}
}
return 0;
}