PAT_A1020
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;
}