1127 ZigZagging on a Tree(30分)

假设二叉树中的所有键都是不同的正整数。可以通过给定的一对后序遍历和有序遍历序列来确定唯一的二叉树。这是一个简单的标准例程,可以按级别顺序打印数字。但是,如果您认为问题太简单了,那就太天真了。这次,您应该按“曲折顺序”打印数字-也就是说,从根开始,逐级打印数字,从左到右和从右到左交替。例如,对于以下树,您必须输出:1 11 5 8 17 12 20 15。

zigzag.jpg

输入规格:

每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数N(30),二叉树中的节点总数。第二行给出顺序,第三行给出后顺序。一行中的所有数字都用空格分隔。

输出规格:

对于每个测试用例,在一行中打印树的锯齿形顺序。一行中的所有数字必须完全由一个空格分隔,并且行尾不得有多余的空格。

输入样例:

8
12 11 20 17 1 15 8 5
12 20 17 11 15 8 5 1
 

样本输出:

1 11 5 8 17 12 20 15

有问题代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
#define  inf  0x3fffffff
typedef struct node{
    int data;
    struct node *lchild;
    struct node *rchild;
}node,*pnode;
vector<int> post,in;
vector<vector<int> > v;
int n;
pnode build(int inL,int inR,int postL,int postR){
    if(postL>postR){
        return NULL;
    }
    pnode root=new node;
    root->data=post[postR];
    int k;
    for(int k=inL;k<=inR;k++){
        if(in[k]==post[postR]){
            break;
        }
    }
    int len=k-inL;
    root->lchild=build(inL,k-1,postL,postL+len-1);
    root->rchild=build(k+1,inR,postL+len,postR-1);
    
    return root;
}
int cnt=0;
void level(pnode root){
    queue<pnode> q;
    pnode inx;
    q.push(root);
    inx=root;
    while(!q.empty()){
        pnode t=q.front();
        if(inx->lchild->data==t->data){
            cnt++;
            inx=t;
        }
        v[cnt].push_back(t->data);
        q.pop();
        if(t->lchild!=nullptr){
            q.push(t->lchild);
        }
        if(t->rchild!=nullptr){
            q.push(t->rchild);
        }
    }
}
int main(){
    pnode root;
    scanf("%d",&n);
    post.resize(n);
    in.resize(n);
    v.resize(n);
    for(int i=0;i<n;i++){
        scanf("%d",&post[i]);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&in[i]);
    }
    root=build(0,n-1,0,n-1);
    pnode nd=new node;
    nd->data=post[n-1];
    level(nd);
    for(int i=0;i<cnt;i++){
        if(i%2==0){
            for(int j=0;j<v[i].size();i++){
                if(j<v[i].size()-1)
                printf("%d ",v[i][j]);
                else{
                    printf("%d\n",v[i][j]);
                }
            }
        }
        else{
            for(int j=v[i].size()-1;j>=0;j--){
                if(j>0)
                printf("%d ",v[i][j]);
                else{
                    printf("%d\n",v[i][j]);
                }
            }
        }
    }
    printf("\n");
    return 0;
}

谁能告诉我,build函数里面哪一句错了?为什么进去了就出不来?

 
posted @ 2021-02-24 20:58  XA科研  阅读(68)  评论(0编辑  收藏  举报