将前序序列存入pre数组,中序序列存入in数组,后序序列存入post数组,则:
前序中序—>后序
#include <cstdio>
using namespace std;
int pre[] = {1, 2, 3, 4, 5, 6};
int in[] = {3, 2, 4, 1, 6, 5};
void post(int pre_root, int in_start, int in_end) {
//root代表子树根结点在前序中的位置
if(in_start > in_end) return ;
int i = in_start;
//在中序中根据前序根结点找子树根结点的位置
while(i < in_end && in[i] != pre[pre_root]) i++;
post(pre_root+1, in_start, i - 1);//访问左子树
post(pre_root + i-in_start + 1, i + 1, in_end);//访问右子树
printf("%d ", pre[pre_root]);//访问根结点
}
int main() {
post(0, 0, 5);
return 0;
}
后序中序—>前序
#include <cstdio>
using namespace std;
int post[] = {3, 4, 2, 6, 5, 1};
int in[] = {3, 2, 4, 1, 6, 5};
void pre(int post_root, int in_start, int in_end) {
//root代表子树根结点在后序中的位置
if(in_start > in_end) return ;
int i = in_start;
//在中序中根据后序根节点找子树根结点的位置
while(i < in_end && in[i] != post[post_root]) i++;
printf("%d ", post[post_root]);//访问根结点
pre(post_root - 1 - in_end + i, in_start, i - 1);//访问左子树
pre(post_root - 1, i + 1, in_end);//访问右子树
}
int main() {
pre(5, 0, 5);
return 0;
}
前序后序转中序(可能不唯一)
#include <iostream>
#include<vector>
using namespace std;
int pre[30], post[30];
int n,flag=1;
vector<int> in;
void In(int postroot, int preroot,int end_onpre,int start_onpost)
{
//前序的根节点等于前序的最后节点说明该子树只有根节点
if (preroot == end_onpre)
{
in.push_back(pre[preroot]);
return;
}
if (pre[preroot] == post[postroot])
{
int i = preroot;
//在前序中找到右子树根节点的位置
while (i <= end_onpre && pre[i] != post[postroot - 1])i++;
if (i - preroot > 1)
In(start_onpost +(i-preroot-1)-1,preroot+1,i-1, start_onpost);
else
//当该子树只有一个叶节点时前序后序一样,中序不唯一,不对该叶节点
//进行左递归,一律当作右孩子
flag = 0;
in.push_back(post[postroot]);
In(postroot-1,i, end_onpre, start_onpost +(i-preroot)-1);
}
}