重建二叉树
时间限制:1000 ms | 内存限制:65535 KB
难度:3
-
描述
- 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
-
输入
- 输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。
输出
-
ACBFGED ABCDEFG CDAB CBAD
样例输出 -
DBACEGF BCAD
解题思路:
1.二叉树的后序中最后一个是根,知道根是那个了,就在中序中找到根所在的位置,根左右分别就是左子树和右子树了。
2.而左子树和右子树的长度(即结点个数)是一定的,所以,在后序中就能知道根结点之后,哪几个是属于左子树或者右子树(它们一定是相邻的,右子树中也一样)。
3.此时,可以输出当前的根,然后递归,传递左子树的后序和中序序列。
4.递归终止条件就是,后序序列中之剩下一个点,输出这个点,返回。
#include <stdio.h> #include <string.h> void PreOrder(char PostStr[],char InStr[]); int main() { char PostStr[100],InStr[100]; while(scanf("%s%s",PostStr,InStr) != EOF) { PreOrder(PostStr,InStr); printf("\n"); } return 0; } void PreOrder(char PostStr[],char InStr[]) { int m,n,llen,rlen,i,j,k = 0; char lPostStr[100],rPostStr[100],lInStr[100],rInStr[100],root; m = strlen(PostStr); n = strlen(InStr); if(m == 1)//递归终止条件 { printf("%c",PostStr[0]); return ; } root = PostStr[m-1];//后序的最后一个为根结点 for(i = 0; i < n; i ++) if(InStr[i] == root) break;//i为中序中的根结点位置 for(j = 0; j < i; j ++)//左子树 lInStr[k ++] = InStr[j]; lInStr[k] = 0; k = 0; for(j = i + 1; j < n; j ++)//右子树 rInStr[k ++] = InStr[j]; rInStr[k] = 0; k = 0; for(j = 0; j < i; j ++)//左子树放在lPostStr里 lPostStr[k ++] = PostStr[j]; lPostStr[k] = 0; k = 0; for(j = i; j < m - 1; j ++)//右子树放在rPostStr里 rPostStr[k ++] = PostStr[j]; rPostStr[k] = 0; k = 0; llen = strlen(lPostStr);//后序中左子树的长度 rlen = strlen(rPostStr);//后序中右子树的长度 printf("%c",root); if(llen > 0)//如果左子树存在,递归 { PreOrder(lPostStr,lInStr); } if(rlen > 0)//如果右子树存在,递归 { PreOrder(rPostStr,rInStr); } }
每组输出数据单独占一行,输出对应得先序序列。
样例输入 - 输入有多组数据(少于100组),以文件结尾结束。