题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 \le 8≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA输出 #1复制
ABCD说明/提示
【题目来源】
NOIP 2001 普及组第三题
1.这个题跟之前那道P1827 [USACO3.4] 美国血统 American Heritage,这道题型是差不多的,然后它就是把先序遍历改成了后序遍历。
2.其实思路是差不多的,因为后序遍历是 左右根 所以我们知道根节点都在后面,我们只需要从后面找根节点,然后在中序遍历里面把它分成左右子树继续递归即可。
左右分开再次看成一个单独的二叉树,从后面找第一个出现的根节点。
因为左子树只有B去了,所以我们找到的在该递归函数下,根节点是B。
我们递归的时候,因为是要输出先序遍历,先序遍历的特点是 根左右,所以我们先输出当前的根,然后遍历左子树和右子树即可。
代码如下:
#include<stdio.h>
#include<string.h>
char zx[30],hx[30],n;
char fun(int left,int right)
{
int i,j;
if(left>right) return 0;
for(i=n-1;i>=0;i--)
{
for(j=left;j<=right;j++)
{
if(hx[i]==zx[j]) break;
}
if(j<=right) break;
}
printf("%c",zx[j]);
fun(left,j-1);
fun(j+1,right);
}
int main()
{
scanf("%s%s",zx,hx);
n=strlen(zx);
fun(0,n-1);
return 0;
}