【问题描述】
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
【输入格式】
两行,每行一个字符串,分别表示中序和后序排列
【输出格式】
一个字符串,表示所求先序排列
【样例输入】
BADC
BDCA
【样例输出】
ABCD
【解题思考】由于已知中序和后序序列,我们只需要找到后序最后一个字符即该树的根节点,然后我们再通过这个根节点通过中序编历找到左子树和右子树,分别进行输出编历,就能得到前序编历序列了
#include <bits/stdc++.h>
using namespace std;
string a;
int solve(char *b,char *c)
{
//中序编历 b BDC A EHGKF
//后序编历 c DCB HKGFE A
char t,*out,*q;
if(!*b) return 0;
//这是找到后序的最后一个结点,为根节点
out=c+strlen(c)-1;
cout<<out;
//strchr:查找‘字符串’b中(首次出现)字符p(根节点/节点)的位置。
q=strchr(b,*out);
//将输出的字符转换为0
*out=0;
//找到后序编历中的右子树部分,并将他存储起来
out=q-b+c;
t=*out;
//将输出过的字符赋为0(在mid和last中)
*out=0;
*q=0;
//现在开始编历左子树,因为是指针归零,所以b,c中剩下的都为左子树部分的内容
solve(b,c);
//编历完左子树我们开始编历右子树
*out=t;
solve(q+1,out);
}
int main()
{
char b[100];
char c[100];
cin>>b;
cin>>c;
solve(b,c);
cout<<endl;
system("pause");
return 0;
}
又或者利用左右子树在中后序中的特殊性,中序左子树的个数就是在后序中的第n个
则:
#include <bits/stdc++.h>
using namespace std;
string a;
void solve(string b,string c)
{
string b1,b2,c1,c2;
//长度
int lenb=b.size();
int lenc=c.size();
a+=c[lenc-1]; //根节点
int pos=b.find(c[lenc-1],0); //获取根结点的坐标
b1=b.substr(0,pos); //中序得出的左子树
b2=b.substr(pos+1,(lenb-pos-1)); //中序得出的右子树
c1=c.substr(0,pos); //因为由中序得出左子树仅有那几个,所以在后序编历中,他左子树也是从左往右第pos个
c2=c.substr(pos,(lenb-pos-1)); //右子树同理
if(b1.size()&&c1.size()) solve(b1,c1); //左子树编历
if(b2.size()&&c2.size()) solve(b2,c2); //右子树编历
}
int main()
{
string b,c;
cin>>b>>c;
solve(b,c);
cout<<a<<endl;
return 0;
}
【参考思想】https://blog.csdn.net/elma_tww/article/details/85640912