HDU

我真是个憨皮,一开始用数组直接建树,忘了会爆,RE3发才知道。然后稍微改了一下树就过了。

题意:按题目意思给出某棵树的访问序列,第一个数为根节点,后一个数如果小于等于根节点则为根节点的右孩子,否则为左孩子,然后在以孩子为根节点按以上规律建树。现在有q个询问,求从根节点出发访问某个节点的路径,如果访问的为左孩子输出‘W’,右孩子输出‘E’。

思路:模拟就完事

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,b,s[1200];
struct node
{
    int l,r;
    int num;
}pp[1200];
queue<string> p[1200];
void dfs(int pos,int nn)
{
    if(pp[pos].l==-1&&pos<s[nn])
    {
           pp[pos].l=s[nn];
           p[s[nn]].push("W");
        return ;
    }
    else if(pp[pos].r==-1&&pos>s[nn])
    {
           pp[pos].r=s[nn];
            p[s[nn]].push("E");
       return ;
    }
    if(s[nn]>pos)
    {
        p[s[nn]].push("W");
        dfs(pp[pos].l,nn);
    }
   else if(s[nn]<pos)
        {
            p[s[nn]].push("E");
            dfs(pp[pos].r,nn);
        }

}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            while(!p[i].empty())p[i].pop();
        }
        for(int i=0; i<n; i++)
        {
             scanf("%d",&s[i]);
             pp[i+1].l=pp[i+1].r=-1;
        }
        p[s[0]].push("");
        for(int i=1; i<n; i++)
        {
            dfs(s[0],i);
        }
        int d;
        scanf("%d",&d);
        for(int i=0; i<d; i++)
        {
            int a;
            scanf("%d",&a);
            while(!p[a].empty())
            {
                cout<<p[a].front();
                p[a].pop();
            }
            printf("
");
        }
    }
    return 0;
}

 附大佬的代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+5;
struct Node{
    Node *lc,*rc;
    int num;
    void clear(){
        num=-1;
        lc=rc=NULL;
    }

}pool[maxn];
Node *root,*cur;
int T,n,a[maxn],q;
Node *newnode()
{
    cur->clear();
    return cur++;
}
void build(Node *root,int value){
    if(root->num==-1){
       root->num=value;
    return;
       }
    if(value>root->num){
        if(root->lc==NULL)root->lc=newnode();
    build(root->lc,value);
    }
    else {
        if(root->rc==NULL)root->rc=newnode();
        build(root->rc,value);
    }
}
inline void init(){
    cur=pool;
    cur->clear();
    root=cur++;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    init();
    root->num=a[1];
    for(int i=2;i<=n;i++){
        if(a[i]>a[1]){
            if(root->lc==NULL)root->lc=newnode();
            build(root->lc,a[i]);
        }
        else {
            if(root->rc==NULL) root->rc=newnode();
            build(root->rc,a[i]);
        }
    }
    scanf("%d",&q);
    for(int i=1,x;i<=q;i++){
        scanf("%d",&x);
        Node *now=root;
        while(x!=now->num){
            if(x>now->num){
                putchar('W');
                now=now->lc;
            }
            else {
                putchar('E');
                now=now->rc;
            }
        }
        puts("");
    }
}

    return 0;
}
原文地址:https://www.cnblogs.com/kayiko/p/10966168.html