算法训练 求先序排列
时间限制:1.0s 内存限制:256.0MB
问题描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入格式
两行,每行一个字符串,分别表示中序和后序排列
输出格式
一个字符串,表示所求先序排列
样例输入
BADC
BDCA
样例输入
BADC
BDCA
样例输出
ABCD
对于中序和后序排列求前序序列,本来以为要通过建树来实现,发现并不是那么回事,可以通过一定的规律来实现
首先对于后序序列,最后一个肯定是最上面的根节点,那么在中序序列里面找到根节点的位置,然后根据根节点的位置来实现分别遍历左子树和右子树,对于左子树也是先通过后序列序列找到根节点的位置,然后对应中序序列的位置对应左子树和右子树
此题目的一个思考的地方是,关于后序序列中的根节点,如果一旦在中序序列中找出,便可以得到左子树和右子树的个数,从而得到进入下一个子树的里面的根节点
#include<cstdio>
#include<cstring>
#define MAX 10
char mid[MAX],later[MAX];
void tree(int l,int r,int st,int ed)
{
int temp=later[ed];
if(l>r||st>ed)
{
return ;
}
else
{
printf("%c",temp);
for(int i=l;i<=r;i++)
{
if(temp==mid[i])
{
tree(l,i-1,st,st+(i-1-l));
tree(i+1,r,st+(i-l-1)+1,ed-1);
return ;
}
}
}
return ;
}
int main()
{
scanf("%s",mid);
scanf("%s",later);
int len=strlen(mid);
tree(0,len-1,0,len-1);
return 0;
}