#include<iostream>
using namespace std;
struct Tree{
int v;
Tree *left, *right;
};
Tree *create_node(int v){
Tree *node = new Tree;
node->v = v;
node->left = node->right = NULL;
return node;
}
// 中序 后序
Tree *mid_post(int *mid, int *post, int N){
int pos = 0;
for( pos = 0; pos<N; pos++){
if(mid[pos] == post[N-1])
break;
}
if(pos == N){
for(int i = 0 ;i<N; i++)
cout<<mid[i]<<" ";
cout<<" ";
for(int i = 0 ;i<N; i++)
cout<<post[i]<<" ";
cout<<"没有与"+post[N-1]<<"相等价的值"<<endl;
}
Tree *node = create_node(post[N-1]);
// 左树存在
if(pos > 0){
node->left = mid_post(mid, post, pos);
}
// 右树存在
if(N-pos-1 > 0){
node->right = mid_post(mid+pos+1, post+pos, N-pos-1);
}
return node;
}
// 中序 先序
Tree *mid_pre(int *mid, int *pre, int N){
int pos = 0;
for( ; pos<N; pos++){
if(mid[pos] == pre[0])
break;
}
if(pos == N){
cout<<"mid中没有与"+ pre[0] << "匹配的项" << endl;
return NULL;
}
Tree *node = create_node(mid[pos]);
if(pos > 0){
node->left = mid_pre(mid, pre+1, pos);
}
if(N - pos - 1 > 0){
node->right = mid_pre(mid+pos+1, pre+pos+1, N-pos-1);
}
return node;
}
// 中序 输出
void mid_order(Tree *node){
if(node != NULL){
if(node->left != NULL)
mid_order(node->left);
cout<<node->v<<" ";
if(node->right != NULL)
mid_order(node->right);
}
}
// 先序 输出
void pre_order(Tree *node){
if(node != NULL){
cout<<node->v<<" ";
if(node->left != NULL)
pre_order(node->left);
if(node->right != NULL)
pre_order(node->right);
}
}
// 后序 输出
void post_order(Tree *node){
if(node != NULL){
if(node->left != NULL)
post_order(node->left);
if(node->right != NULL)
post_order(node->right);
cout<<node->v<<" ";
}
}
int main(){
int len = 7;
//int mid[] = {3, 2, 1, 4, 5, 7 , 6};
//int post[] = {3, 1, 2, 5, 6, 7, 4};
//Tree *root = mid_post(mid, post, len);
//mid_order(root);
int mid[] = {1, 2, 3, 4, 5, 6, 7};
int pre[] = {4, 2, 1, 3, 5, 7, 6 };
Tree *root = mid_pre(mid, pre, len);
post_order(root);
cin>>len;
return 0;
}