给定一棵二叉树的后序遍历和中序遍历,请你输出其先序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的先序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
6 4 2 5 1 6 3 4 5 2 3 1 6
输出样例:
3 5 4 2 1 6
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int per[N],in[N],post[N];
int k;
//定义二叉树
struct node{
int val;
node *l;
node *r;
node(int val):val(val),l(NULL),r(NULL){}
};
//建树
void build(int l,int r,int &t,node *&root){
//
//if(t==0) return ;或者下边写if(flag==-1) return ;都可以
int flag=-1;
for(int i=l;i<=r;i++)
if(in[i]==post[t]){
flag=i;break;
}
//
if(flag==-1) return ;
root=new node(in[flag]);
t--;
/
///这两句的顺序
if(flag<r) build(flag+1,r,t,root->r);
if(flag>l) build(l,flag-1,t,root->l);
}
//前序遍历
void qian(node*root){
if(root!=NULL){
per[k++]=root->val;
qian(root->l);
qian(root->r);
}
}
void refree(node*root){
if(root==NULL) return ;
refree(root->l);
refree(root->r);
delete root;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>post[i];
for(int i=1;i<=n;i++) cin>>in[i];
node *root;
int t=n;
build(1,n,t,root);
k=0;
qian(root);
for(int i=0;i<k;i++){
cout<<per[i];
if(i!=k-1) cout<<" ";
}
refree(root);
return 0;
}