题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
代码:
#include<stdio.h>
#include<string.h>
char a[100]={0},b[100]={0},c[100]={0},dd[100]={0};//c字符串收录结果,dd字符串标记b字符串的元素被收录的位置
int k=1,n,p=0;
void kk(int i,int j)
{
int x,y=0;
if(i>j)return ;
if(i==j){
for(x=j;b[x]!=a[i];x--);
if(dd[x]==1)return ;//说明超出界限
c[k++]=a[i];//收录在c字符串中
dd[x]=1; //标记
}
else {
for(x=j;dd[x]==1;x--);//寻找当前所在区间的根节点
dd[x]=1;
while(b[x]!=a[y])y++;//在区间中又开始分成两个部分
if(y>j)return;
c[k++]=b[x];//收录
kk(i,y-1);
kk(y+1,j);
}
}
int main()
{
scanf("%s",a);
scanf("%s",b);
n=strlen(a);
c[0]=b[n-1];//把根节点收入字符串中
dd[n-1]=1;
while(a[p]!=c[0])p++;//找根节点在a字符串的位置
kk(0,p-1);//开始对两个部分开始找节点
kk(p+1,n-1);
printf("%s",c);
}