给出二叉树的中序遍历序列和后序遍历序列,编程还原该二叉树。
输入:
第1行为二叉树的中序遍历序列
第2行为二叉树的后序遍历序列
输出:
二叉树的按层遍历序列
测试输入
badcfeg bdfgeca
测试输出
abcdefg
源代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild , *rchild;
}BiTNode,*BiTree;
BiTree ReBiTree( char PostOrder[] , char InOrder[] , int i , int j , int k , int h ) // , ,后序第一个元素,后序最后一个元素,中序第一个元素,中序最后一个元素
{
BiTree T;
T=(BiTree)malloc(sizeof(BiTNode));
T->data = PostOrder[j]; //找到根结点
int m=k;
while( InOrder[m] != PostOrder[j] )
{
m++;
}
if( InOrder[k] == PostOrder[j] ){
T->lchild=NULL; //无左孩子
}
else{
T->lchild=ReBiTree( PostOrder , InOrder , i , i+m-k-1 , k , m-1 );
}
if( InOrder[h] == PostOrder[j] ){
T->rchild=NULL; //无右孩子
}
else{
T->rchild=ReBiTree( PostOrder , InOrder , i+m-k , j-1 , m+1 , h );
}
return T;
}
int LevelOrder(BiTree T,int level)
{
if(!T || level < 0) return 0;
if( level == 0 ) {
printf("%c",T->data);
return 1;
}
return LevelOrder(T->lchild,level-1) + LevelOrder(T->rchild,level-1);
}
int main()
{
char InOrder[100];
char PostOrder[100];
scanf("%s",&InOrder);
scanf("%s",&PostOrder);
int len=strlen(InOrder);
BiTree T;
T=ReBiTree(PostOrder,InOrder,0,len-1,0,len-1);
for( int i=0;;i++ ){
if(!LevelOrder(T,i))
break;
}
printf("\n");
return 1;
}