HDU 5444-二叉树的遍历+建树

来源:互联网 发布:淘宝介入后卖家的下场 编辑:程序博客网 时间:2024/05/11 03:29

题意:

一颗二叉树,有 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;}



0 0
原创粉丝点击