给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。
输入格式 22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式 11行,表示一棵二叉树的先序。
输入输出样例
输入
BADC
BDCA
输出
ABCD
后序遍历的最后一个元素一定是先序遍历的第一个元素,因此递归地求后序遍历的最后一个元素,再结合中序遍历,就可以知道左子树和右子树。
如示例:
BADC
BDCA
先序遍历的第一个元素一定是A,然后左子树是B,右子树是DC,再用同样的方法递归求解.递归的区间通过画图和模拟不难得出。
#include<iostream>
#include<string>
using namespace std;
string a,b,res;
int find(char c){
for(int i=0;i<a.size();i++){
if(a[i]==c)return i;
}
}
void solve(int L1,int R1,int L2,int R2){
int m=find(b[R2]);
cout<<b[R2];
if(m>L1)solve(L1,m-1,L2,R2-R1+m-1);//r1-m为右子树结点数。 第二个字符串从L2,到(R2-(R1-M))
if(m<R1)solve(m+1,R1,L2+m-L1,R2-1);//m-r1为左子树结点数, 第二个字符串从L2,到(L2+(M-R1))
}
int main(){
cin>>a>>b;
int len=a.size();
solve(0,len-1,0,len-1);
return 0;
}