#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點*/
struct node {
char value;
node *lchild, *rchild;
};
node *newnode(char c) {//建立新的結點
node *p = (node*)malloc(sizeof(node));
(*p).value = c;
(*p).lchild = (*p).rchild = NULL;
}
node *rebuild(char* post, char* in, int n) {//由後序遍歷和中序遍歷重建二叉樹
if (n == 0) return NULL;
char ch = post[n-1];//後序遍歷最後一個結點即爲根結點
node *p = newnode(ch);//建立子樹的根節點
int i = 0;
while (i < n && in[i] != ch) i++;//根據中序遍歷獲得左子樹與右子樹的分界
int l_len = i;
int r_len = n-i-1;
if (l_len > 0) (*p).lchild = rebuild(post, in, l_len);//遞歸遍歷左子樹
if (r_len > 0) (*p).rchild = rebuild(post+l_len, in+l_len+1, r_len);//遞歸遍歷右子樹
return p;
}
void preorder(node *p) {//先序遍歷二叉樹 ,打印各個結點的權值
if (p == NULL) return;
printf("%c", (*p).value);
preorder((*p).lchild);
preorder((*p).rchild);
}
int main() {
char in[30], post[30];
while (scanf("%s%s", post, in) != EOF) {
node *root = rebuild(post, in, strlen(post));
preorder(root);
printf("\n");
}
}