重建二叉树
描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
输入输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。输出每组输出数据单独占一行,输出对应得先序序列。样例输入ACBFGED ABCDEFG
CDAB CBAD
样例输出DBACEGF
BCAD
1.1
温习如何已知二叉树的中序后序求前序:
分析:
先复习一下前序遍历, 中序遍历, 后序遍历的次序
前序遍历:1.访问根节点。2.访问左子树。3.访问右子树
中序遍历:1.访问左子树。2.访问根节点。3.访问右子树
后序遍历:1.访问左子树。2.访问右子树。3.访问根节点
先用手工试算出这个前序序列
后序遍历: ACBFGED
中序遍历: ABCDEFG
第一步:
由后序遍历知道根节点是D
第二步:
由中序序列知道左子树是{A,B,C}, 右子树是{E,F,G}
重复一二两步,
知道E是右子树的根节点,并存在右子树,没有左子树
反复套用一二两步规则,最终可得到整颗树
1.2
思路分析(是一位大神的思路 非常好理解)
1.后序:存数组a 中序:存数组b
2.递归函数:void recover(int root,int start,int end)
root代表根节点在a中的位置 start表示b所操作部分的起始位置
3.遍历b 找到根节点的位置 用i储存
4.打印根节点
5.递归左子树
ps:这时候要传的start,end,root是针对左子树ABC来说的
root=root-(end-i)-1;start不变;end=i-1;
6.递归右子树
ps: 同样针对EFG
root=root-1;start=i+1;end不变
注意:当end==start时 当前节点已经是叶子节点了 所以start>end是结束条件
1.3
代码总览:
//重建二叉树 已知后序和中序求先序
#include <stdio.h>
#include <string.h>
char a[1000],b[1000];
void recover(int root,int start,int end)
{
if(start>end) return;
int i=start;//i用来遍历
while(i<end&&b[i]!=a[root])//遍历b找到根节点
i++;
printf("%c",a[root]);//打印根节点
recover(root-(end-i)-1,start,i-1);//遍历左子树
recover(root-1,i+1,end);//遍历右子树
}
int main()
{
while(scanf("%s",a)!=EOF)
{
scanf("%s",b);
int l=strlen(a);
recover(l-1,0,l-1);
printf("\n");
}
return 0;
}