#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
typedef char ElementType;
/*
* 二叉树
*/
struct TreeNode {
ElementType data;
TreeNode* leftChild;
TreeNode* rightChild;
TreeNode(char c) {
this->data = c;
this->leftChild = nullptr;
this->rightChild = nullptr;
}
};
/**
* 访问结点
* @param node
*/
void visit(TreeNode* node);
/**
* 后序遍历
* @param root
*/
void postOrder(TreeNode* root);
/**
* 由先序遍历和中序遍历构建二叉树
* @param preOrder
* @param inOrder
* @return
*/
TreeNode* build(string preOrder, string inOrder) {
if (preOrder.size() == 0) {
return nullptr;
}
/*
* 前序遍历的第一个元素必为根
*/
char cur = preOrder[0];
TreeNode* root = new TreeNode(cur);
int pos = inOrder.find(cur);
/*
* 分别递归构建左子树和右子树
* 对于中序遍历而言,假设中序遍历中根节点的索引为index
* 1. 左子树元素的索引区间是[0, index-1]
* 2. 右子树元素的索引区间是[index+1, inOrder.size()-1]
*
* 对于前序遍历来说,假设中序遍历中根节点的索引为index
* 1. 左子树元素的索引区间是[1, index-1]
* 2. 右子树元素的索引区间是[index+1, preOrder.size()-1]
*/
root->leftChild = build(preOrder.substr(1, pos), inOrder.substr(0, pos));
root->rightChild = build(preOrder.substr(pos + 1), inOrder.substr(pos + 1));
return root;
}
/**
* 遍历--清华大学
* @return
*/
int main() {
string preOrder;
string inOrder;
while (cin >> preOrder >> inOrder) {
TreeNode* root = build(preOrder, inOrder);
postOrder(root);
cout << endl;
}
return 0;
}
void postOrder(TreeNode* root) {
if (root == nullptr) {
return;
}
/*
* 先后遍历左子树、右子树、根
*/
postOrder(root->leftChild);
postOrder(root->rightChild);
visit(root);
}
void visit(TreeNode* node) {
cout << node->data;
}