1127 ZigZagging on a Tree (30 分)

水~,基于层序遍历。

树高最坏情况下为\(n\),即为一条链。

const int N=35;
unordered_map<int,int> pos;
unordered_map<int,PII> tree;
unordered_map<int,int> dep;
int in[N],post[N];
int n;
vector<int> level[N];
int maxh;

int build(int inl,int inr,int postl,int postr)
{
    if(inl > inr) return -1;

    int root=post[postr];
    int k=pos[root];
    int leftLen=k-inl;
    int lchild=build(inl,k-1,postl,postl+leftLen-1);
    int rchild=build(k+1,inr,postl+leftLen,postr-1);
    tree[root]={lchild,rchild};
    return root;
}

void bfs(int root)
{
    queue<int> q;
    q.push(root);
    dep[root]=1;
    while(q.size())
    {
        int t=q.front();
        q.pop();

        maxh=max(maxh,dep[t]);
        level[dep[t]].pb(t);

        if(~tree[t].fi)
        {
            dep[tree[t].fi]=dep[t]+1;
            q.push(tree[t].fi);
        }
        if(~tree[t].se)
        {
            dep[tree[t].se]=dep[t]+1;
            q.push(tree[t].se);
        }
    }
}

int main()
{
    cin>>n;

    for(int i=0;i<n;i++) cin>>in[i],pos[in[i]]=i;
    for(int i=0;i<n;i++) cin>>post[i];

    int root=build(0,n-1,0,n-1);

    bfs(root);

    for(int i=1;i<=maxh;i++)
    {
        if(i & 1) reverse(level[i].begin(),level[i].end());

        for(int j=0;j<level[i].size();j++)
            if(j) cout<<' '<<level[i][j];
            else cout<<level[i][j];

        if(i<maxh) cout<<' ';
        else cout<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-03-12 09:29  Dazzling!  阅读(32)  评论(0编辑  收藏  举报