小Valentine非常喜欢玩二叉树,她喜欢的游戏是随意构造一颗二叉树,用大写字母编号标识结点。下图是她构造的二叉树中的一棵:
D
/ \
B E
/ \ \
A C G
/
F
为了向她的后代记录她所创建的树,她给每棵树写下两串字符串,表示后序遍历(左子树,右子树,根)和中序遍历(左子树,根,右子树)的结果。
对于上面的树,后序遍历的结果是ACBFGED,中序遍历的结果是ABCDEFG。
她认为这样的一对字符串给出了重构这棵树的足够的信息(但她从来没有尝试去重构二叉树)。
过了好些年,她认识到重构这些树的确是可能的。对于同一棵树,同一个字母不会用两次。
然而,如果手工完成重构二叉树,那是非常乏味的。因此,请您编写一个程序来为她完成这一项工作。
Sample Input
ACBFGED ABCDEFG CDAB CBAD Sample Output
DBACEGF BCAD
#include<bits/stdc++.h>
using namespace std;
void tree( string x, string y )
{
if( y.size() <= 0 )
{
return ;
}
int tmp = x.find( y[y.size() - 1 ] );
cout << y[ y.size() - 1 ];
tree( x.substr( 0, tmp ), y.substr( 0, tmp ) );
tree( x.substr( tmp + 1 ), y.substr( tmp, y.size() - tmp - 1 ) );
return ;
}
int main()
{
string x, y;
while( cin >> x >> y )
{
tree( y, x );
cout << endl;
}
return 0;
}