已知前序中序求后序
//Tree Recovery
#include <iostream>
#include <string>
using namespace std;
void PostOrder(int pre[], int in[], int post[], int left, int right, int&pos, int&index);//構建后序遍歷序列
void input(int a[], const int n, string s);//輸入
void output(int a[], const int n);//輸出
int find(int a[], int left, int right, const int e);//在中序序列中找與先序序列對應的元素的位置
int main()
{
int length;//序列長度
int pos = 0;//序列查找的位置
int index = 0;//構建后序序列的下標
cout << "length:";
cin >> length;
int* in = new int[length];
int*pre = new int[length];
int*post = new int[length];
input(pre, length, "PreOrder:");
input(in, length, "InOrder:");
PostOrder(pre, in, post, 0, length - 1, pos, index);
output(post, length);
return 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void PostOrder(int pre[], int in[], int post[], int left, int right, int&pos, int&index)
{
if (left > right)//節點不存在
{
return;
}
int i = find(in, left, right, pre[pos++]);//查找
if (i == right && right == left)//葉子結點
{
post[index++] = in[i];//加入后續遍歷序列中
return;
}
PostOrder(pre, in, post, left, i - 1, pos, index);//遞歸左子樹
PostOrder(pre, in, post, i + 1, right, pos, index);//遞歸右子樹
post[index++] = in[i];//插入根節點
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void input(int a[], const int n, string s)
{
cout << s;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
}
void output(int a[], const int n)
{
cout << "PostOrder:";
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
}
int find(int a[], int left, int right, const int e)
{
for (int i = left; i <= right; i++) {
if (e == a[i])
return i;
}
return 0;
}