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

该博客介绍了如何根据先序遍历的顺序建立二叉树并输出从根节点到特定节点的路径。通过递归方式在建树过程中直接确定路径,避免了额外的遍历步骤。提供了具体的输入输出示例和问题分析。
摘要由CSDN通过智能技术生成

题意:

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值