#include<cstdio>
#include<cstring>
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct Node
{
Node * lchild,*rchild;
char value;
} Tree;
void ReBuild(char *PreOrder,char *InOrder,int TreeLen,Tree** root)
{
Tree *p;
char *LeftEnd;
if(PreOrder==NULL||InOrder==NULL||root==NULL)//检查边界条件
{
return ;
}
p=(Tree *)malloc(sizeof(Tree));//获的前序遍历的第一个节点
p->value=*PreOrder;
p->lchild=p->rchild=NULL;
*root =p;
if(TreeLen==1)
return ;//一个节点直接结束
LeftEnd=InOrder;//LeftEnd得到先序遍历根节点的值
while(*LeftEnd!=*PreOrder)//在中序遍历中找到该点的位置
{
LeftEnd++;
}
//寻求左子树的长度
int LeftLen=0;
LeftLen=(int)(LeftEnd-InOrder);
int RightLen=0;
//寻求右子树的长度
RightLen=TreeLen-LeftLen-1;
if(LeftLen>0)//重建左子树
ReBuild(PreOrder+1,InOrder,LeftLen,&(p->lchild));
if(RightLen>0)//重建 右子树,递归
ReBuild(PreOrder +LeftLen+1,InOrder+LeftLen+1,RightLen,&(p->rchild));
}
void PostOrder(Tree *p)//二叉树建完之后进行后续遍历。
{
if(p!=NULL)
{
PostOrder(p->lchild);
PostOrder(p->rchild);
cout<<p->value;
}
}
int main()
{
char a[110],b[110];
Tree *p;
while(cin>>a>>b)
{
int len=strlen(a);
ReBuild(a,b,len,&p);
PostOrder(p);
cout<<endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。