(已知二叉树的先序和中序求后序)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include <string>
using namespace std;
string s1,s2;
typedef struct bitnode
{
char data;
struct bitnode* lchild;
struct bitnode* rchild;
}bitnode,*bitree;
bitree create(int ileft1,int iright1,int ileft2,int iright2)
{
bitree t=(bitree)malloc(sizeof(bitnode));
t->data=s1[ileft1];
t->lchild=NULL;
t->rchild=NULL;
int mid=s2.find(s1[ileft1]);
if(mid>ileft2)//有左子树
t->lchild=create(ileft1+1,ileft1+mid-ileft2,ileft2,mid-1);
if(mid<iright2)//有右子树
t->rchild=create(ileft1+1+mid-ileft2,iright1,mid+1,iright2);
return t;
}
void postprint(bitree t)//后序输出
{
if(t->lchild!=NULL)
postprint(t->lchild);
if(t->rchild!=NULL)
postprint(t->rchild);
printf("%c",t->data);
}
int main()
{
cin>>s1>>s2;
bitree T;
T=create(0,s1.length()-1,0,s2.length()-1);
postprint(T);
return 0;
}
其中ileft1,iright1分别为s1数组(先序数组)的头序号和尾序号。ileft2,iright2分别为s2数组(中序数组)的头序号和尾序号。mid为根结点所在位置序号。
还有一种简便做法
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
string s1, s2;
void pre_in_postcal(int ileft1,int iright1,int ileft2,int iright2)
{
int mid = s2.find(s1[ileft1]);
if (mid > ileft2)
pre_in_postcal(ileft1 + 1, ileft1 + mid - ileft2, ileft2, mid - 1);
if (mid < iright2)
pre_in_postcal(ileft1 + 1 + mid - ileft2, iright1, mid + 1, iright2);
cout << s1[ileft1];
}
int main()
{
cin >> s1 >> s2;
pre_in_postcal(0, s1.length() - 1, 0, s2.length() - 1);
}