题目描述
有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。现有两组字母,分别表示前序遍历(父节点->左孩子->右孩子)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出后序遍历(左孩子->右孩子->父节点)的结果。
输入
每个输入文件包含两串字母,各占一行。(每串只包含大写字母)
第一行字母表示前序遍历结果,第二行字母表示中序遍历结果。
输出
输出仅一行,表示后序遍历的结果,结尾换行。
样例
输入样例 1 复制
DBACEGF
ABCDEFG
输出样例 1
ACBFGED
/*
* Create: 2019-8-20
*/
#include <stdio.h>
#include <string.h>
enum {
ZERO = 0,
ONE = 1,
TWO,
TWENTYSIX = 26,
TWENTYSEEVN
};
#define ZEROCH '\0'
typedef struct TagTree {
char ch;
struct TagTree *left;
struct TagTree *right;
} Tree;
Tree *TreeRoute(char *pre, char *middle, int len)
{
if (len == ZERO) {
return NULL;
}
Tree *head = (Tree *)malloc(sizeof(Tree));
if (head == NULL) {
return NULL;
}
int leftLen = ZERO;
char ch = *pre;
head->ch = ch;
if (len == ONE) {
head->left = NULL;
head->right = NULL;
return head;
}
for (; leftLen < len; ++leftLen) {
if (ch == *(middle + leftLen)) {
break;
}
}
head->left = TreeRoute(pre + ONE, middle, leftLen);
head->right = TreeRoute(pre + ONE + leftLen, middle + ONE + leftLen, len - ONE - leftLen);
return head;
}
char g_post[TWENTYSEEVN];
char g_curr = 0;
void postRoute(Tree *head)
{
if (head == NULL) {
return;
}
if (head->left) {
postRoute(head->left);
}
if (head->right) {
postRoute(head->right);
}
g_post[g_curr] = head->ch;
g_curr++;
free(head);
return;
}
int main()
{
char pre[TWENTYSEEVN];
char middle[TWENTYSEEVN];
int res1 = scanf_s("%s", pre, TWENTYSEEVN);
int res2 = scanf_s("%s", middle, TWENTYSEEVN);
if (res1 != res2) {
return -1;
}
int len = strlen(pre);
Tree *head = TreeRoute(pre, middle, len);
g_curr = 0;
postRoute(head);
g_post[len] = ZEROCH;
printf("%s", g_post);
return 0;
}