求后序遍历
Description
给出一棵二叉树的前序和中序遍历,求它的后序遍历。(树结点用不同的大写字母表示,长度小于等于26。)
Input
本问题有多组测试数据,每组测试数据有两行,每行都是由大写字母组成,分别表示一颗二叉树的前序和中序遍历。
Output
根据给定的前序和中序遍历,输出相应的后序遍历。
Sample Input
ABCD
BADC
Sample Output
BDCA
想法
分析结论
1.由前序遍历和中序遍历可以唯一确定一棵树。
2. 由中序遍历和后续遍历也可以唯一确定一棵树。
3. 但是由前序遍历和后续遍历则无法唯一确定一棵二叉树。
思路:
- 根据前序遍历,确定二叉树的根。
- 在中序遍历中找到根,确定二叉树的左右子树。
- 根据中序遍历中确定的左右子树的长度,在前序遍历中截取相应的左右子树。
将左右子树分别进行步骤(2)和(3)。
Code
#include<bits/stdc++.h>
using namespace std;
const int MAX=100005;
#define EPS 1E-5
typedef long long ll;
string sPost(string sPre,string sMid);
int main()
{
string sPreOrd,sMidOrd,sPostOrd;
while(cin>>sPreOrd>>sMidOrd)
{
sPostOrd=sPost(sPreOrd,sMidOrd);
cout<<sPostOrd<<endl;
}
return 0;
}
string sPost(string sPre,string sMid)
{
char cRoot;
int nPos,nLen;
string sP1,sP2,sM1,sM2,sRet;
sRet="";
nLen=sPre.size();
cRoot=sPre[0];
nPos=sMid.find(cRoot);
if(nLen>1)
{
if(nPos>0)
{
sP1=sPre.substr(1,nPos);
sM1=sMid.substr(0,nPos);
sRet+=sPost(sP1,sM1);
}
if(nLen-1>nPos)
{
sP2=sPre.substr(nPos+1,nLen-1-nPos);
sM2=sMid.substr(nPos+1,nLen-1-nPos);
sRet+=sPost(sP2,sM2);
}
}
sRet+=cRoot;
return sRet;
}