蒜头君最近在学习二叉树,可是心不在焉的他一会儿就学累了,于是他想休息会儿。蒜头君拿出镜子,对着镜子中的自己各种卖萌。蒜头君无意间看见镜子中出现了一棵二叉树,这不是他刚画的那棵二叉树么,在镜子里怎么左右颠倒了呀。
蒜头君觉得好神奇,于是他又随手画了一棵二叉树,他想知道这棵二叉树在镜子里是长什么样的。为了将问题简单,现在蒜头君告诉你这棵二叉树的先序遍历结果和中序遍历结果,求原始二叉树的后序遍历结果,以及镜子里的二叉树的后序遍历结果。
输入格式
输入第一行是一个字符串pre_str,代表原始二叉树的先序遍历结果;输入第二行是一个字符串in_str,代表二叉树的中序遍历结果。每个字符代表结点的编号,结点的编号互不相同,字符仅由大小写字母组成。保证两个字符串长度相等,长度最大不超过 50,且保证可以通过先序遍历结果和中序遍历结果构造出一棵唯一的二叉树。
输出格式
输出第一行,输出一个字符串,代表原始二叉树的后序遍历结果;
输出第二行,输出一个字符串,代表镜子里的二叉树的后序遍历结果。
样例输入
abdce
dbaec
样例输出
dbeca
ecdba
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Tree {
char data;
struct Tree *lchild, *rchild;
} Tree;
Tree* init(char data) {
Tree *tree = (Tree *)malloc(sizeof(Tree));
tree->lchild = NULL;
tree->rchild = NULL;
tree->data = data;
return tree;
}
void postorder(Tree *t) {
if (t->lchild != NULL) {
postorder(t->lchild);
}
if (t->rchild != NULL) {
postorder(t->rchild);
}
printf("%c", t->data);
}
void rev_postorder(Tree *t) {
if (t->rchild != NULL) {
rev_postorder(t->rchild);
}
if (t->lchild != NULL) {
rev_postorder(t->lchild);
}
printf("%c",t->data);
}
Tree* build(char pre_str[], char in_str[], int len) {
Tree *t = init(pre_str[0]);
int pos = strchr(in_str, pre_str[0]) - in_str;
if (pos > 0) {
t->lchild = build(pre_str + 1, in_str, pos);
}
if (len - pos - 1 > 0) {
t->rchild = build(pre_str + 1 + pos, in_str + 1 + pos, len - pos -1);
}
return t;
}
void clear(Tree *t) {
if (t->lchild != NULL) {
clear(t->lchild);
}
if (t->rchild != NULL) {
clear(t->rchild);
}
free(t);
}
int main() {
char pre_str[50] , in_str[50];
scanf("%s", pre_str);
scanf("%s", in_str);
Tree *tree = build(pre_str, in_str, strlen(pre_str));
postorder(tree);
printf("\n");
rev_postorder(tree);
printf("\n");
clear(tree);
return 0;
}