描述
接收二叉树前序序列和中序序列(各元素各不相同),输出该二叉树的后序序列。
格式
输入格式
输入有三行:
第一行为数字n。
第二行有n个数字,表示二叉树的前序遍历。
第三行有n个数字,表示二叉树的中序遍历。
输出格式
输出一行,表示该二叉树的后序遍历序列。
样例
输入
5
1 2 4 5 3
4 2 5 1 3
输出
4 5 2 3 1
#include <iostream>
using namespace std;
int a[100000], b[100000]; // 两个数组(前序和中序数组)
int x = 0; // 前序排序索引
template<class T>
// 节点结构体
struct Node{
T element;
Node<T>* left, * right;
Node<T>() {
left = right = NULL;
}
Node<T>(const T& e) {
element = e;
left = NULL;
right = NULL;
}
Node<T>(const T& e, Node<T>* l, Node<T>* r) {
element = e;
right = r;
left = l;
}
};
template<class T>
class Tree{
public:
void change(Node<T>*t){ // 更改根节点
root = t;
}
Node<T> *get(){ // 得到根节点
return root;
}
Tree(){root = NULL;} // 构造函数
// 后序排序
void postOrder(Node<T>*t){
if(t != NULL){
postOrder(t->left);
postOrder(t->right);
visit(t);
}
}
void visit(Node<T>*t){ // 输出对应的值
cout << t->element << " ";
}
// 构建树
Node<T> *build(Node<T>*t, int left, int right){
int i;
int d = a[x];
x++;
for(i = left; i < right; i++){ // 找到前序排序中的元素在中序排序中的位置
if(b[i] == d){break;}
}
t = new Node<T>();
t->element = d; // 建立节点,进行根赋值
if(i > left && i < right){ // 对左根进行操作
t->left = build(t->left, left, i);
}
if(i >= left && i < right-1){ // 对右根操作
t->right = build(t->right, i+1, right);
}
return t; // 返回根节点
}
private:
Node<T>*root;
};
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){cin >> a[i];}
for(int i = 0; i < n; i++){cin >> b[i];}
Tree<int>B;
Node<int>*p = NULL;
B.change(B.build(B.get(), 0, n));
B.postOrder(B.get());
cout << endl;
return 0;
}