PAT甲级1020.

目录

A1020

题目

样例

输入:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出:

4 1 6 3 5 7 2

思路和坑点

  根据后序和中序序列递归建树,然后使用层序遍历输出结果。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef struct node{
    int data;
    struct node *right,*left;
    node(){
        right=left=NULL;
    }
}Node;
vector<int> post,in;
void layorder(Node *root){                    //层序遍历 
    int cnt=0;
    queue<Node*> q;
    q.push(root);
    while(!q.empty()){
        Node *now=q.front();
        q.pop();
        if(cnt++) putchar(' ');
        printf("%d",now->data);
        if(now->left)    q.push(now->left);
        if(now->right)    q.push(now->right);
    }
}
Node * creat(int pl,int pr,int il,int ir){    //根据中序和后序序列递归建树 
    if(pl>pr)    return NULL;                //递归边界,序列中没有结点时 
    Node *root=new node;
    root->data=post[pr];                    //根结点赋值 
    int k;
    for(k=il;k<=ir;k++){                    //找到根结点在中序的位置 
        if(post[pr]==in[k])
            break;
    }
    int lnum=k-il;                            //计算左子树的结点个数 
    root->left=creat(pl,pl+lnum-1,il,k-1);    //递归建立左右子树 
    root->right=creat(pl+lnum,pr-1,k+1,ir);
    return root;                            //返回建成的树 
}
int main(void){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt","r",stdin);
#endif
    int n;
    scanf("%d",&n);
    post.resize(n); in.resize(n);
    for(int i=0;i<n;i++){
        scanf("%d",&post[i]);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&in[i]);
    }
    Node *root=creat(0,n-1,0,n-1);
    layorder(root);
    return 0;
}