zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",v[i][j]);
                    }
                }
            }
        }
        printf("
    ");
        return 0;
    }

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

     
  • 相关阅读:
    Maven简介
    Activiti核心API
    Activiti数据库支持
    使用idea进行activiti工作流开发入门学习
    Activiti 工作流
    枚举其他用法
    枚举类的基本使用
    kotlin中抽象类
    kotlin中接口
    kotlin 类的继承
  • 原文地址:https://www.cnblogs.com/dreamzj/p/14443767.html
Copyright © 2011-2022 走看看