题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入描述
两个字符串,分别是中序和后序(每行一个)
输出描述
一个字符串,先序
样例输入
BADC
BDCA
样例输出
ABCD
分析
根据后续遍历的最后一个字符是根节点,然后在中序遍历中找到该根节点,根节点左边即为左子树,右边即为右子树,继续对左子树和右子树进行相同操作,即递归
#include<cstdio>
#include<cstring>
#define N 100
char in[N], post[N];
void tree(int l1, int r1, int l2, int r2)
{
if (l1 > r1 || l2 > r2) return;
char t = post[r2]; // 找到根节点,后续遍历的最后一个字符代表根节点
printf("%c", t);
for (int i = l1; i <= r1; i++) {
if (t == in[i]) {
int cnt = i - l1; // 左子树的节点个数
tree(l1, i - 1, l2, l2 + cnt - 1); // 左子树
tree(i + 1, r1, l2 + cnt, r2 - 1); // 右子树
return; // 找到根就不需要继续循环了
}
}
}
int main()
{
scanf("%s%s",in,post);
int len = strlen(in);
tree(0, len - 1, 0, len - 1);
return 0;
}