题意:
一颗二叉树,有 n 个节点,给出n个节点的先序遍历,即左边小,右边大。之后给出数字m,然后给出m个节点,写出从根节点到m个节
点的路径,往右遍历即往西输出W,往左遍历即往东输出E。
输入:
2
4
2 1 4 3
3
1 2 3
6
6 5 4 3 2 1
1
1
输出:
E
WE
EEEEE
分析:
首先设立节点的属性:左节点,右节点。(由于已经从题意中看出来是给出二叉树的先序遍历,因此不用在设置根节点) 之后再递
归建树,并且在递归建树的过程中判断路径。建立左节点输出E,建立右节点就输出W。省下了建好树后再继续遍历的时间。
代码:
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
string str[1005];
struct Node
{
int l;
int r;//s[0]右节点,s[1]左节点
} nodes[1005];
void add_node(int left, int &right) //递归建树
{
if(left > right)
{
if(nodes[left].l == -1) //没有节点
{
nodes[left].l = right; //建立数值小的节点
str[right] = str[left] + "E"; //往左走
}
else //有节点或者已经建好节点
add_node(nodes[left].l, right);
}
else
{
if(nodes[left].r == -1)
{
nodes[left].r = right; //建立数值大的节点
str[right] = str[left] + "W"; //往右走
}
else
add_node(nodes[left].r, right);
}
}
int main()
{
int k,n,m,T,a[1005];
scanf("%d",&T);
while(T--)
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i++)
nodes[i].r = nodes[i].l = -1;//初始化
str[a[1]] = ""; //初始化
for(int i = 2; i <= n; i++) //默认第一个节点是根节点
add_node(a[1], a[i]);
scanf("%d",&m);
for(int i = 1; i <= m; i++)
{
scanf("%d", &k);
cout << str[k] << endl;
}
}
return 0;
}