由二叉树的前序和中序得到后序的问题
基本思想:前序、中序=>二叉树=>后序
由前序得到第一个根节点;
找出中序中此根节点的位置,将二叉树分成了左子树和右子树;
左子树和右子树又可以看作新的二叉树…
直至左子树和右子树为叶子终止。
例如:
前序:abdec,中序:dbeac
1.0)根节点是a,将中序分成dbe(a的左子树)和c(a的右子树)两部分
1.1)【左子树】前序:bde,中序:dbe
1.1.0)根节点是b,将中序分成d(b的左子树)和e(b的右子树)两部分
1.1.1)【左子树】d就是b的左叶子
1.1.2)【右子树】e就是b的右叶子
1.2) 【右子树】c就是a的右叶子
2.0)后序就可以由二叉树递归得出,即后序:debca
#include <bits/stdc++.h>
using namespace std;
const int maxx=1000;
//结构体定义二叉树类型
struct BiNode{
char data;
BiNode *lchild,*rchild;
};
//由前序、中序得二叉树
BiNode * RebuildCode(char *PreStart,char *PreEnd,char *InStart,char *InEnd){
//建立一个节点,保存前序的第一个根节点
BiNode *root = new BiNode();
root->data = PreStart[0];
root->lchild = NULL;
root->rchild = NULL;
if(InEnd == InStart && *InStart == *InEnd){//叶子节点
return root;
}
//在中序中寻找根节点的位置
char *Inroot = InStart;
while(*PreStart != *Inroot){
Inroot++;
}
//找左右子树
int leftlen = Inroot-InStart;//左子树的长度
if(leftlen>0){
root->lchild = RebuildCode(PreStart+1,PreStart+leftlen,
InStart,InStart+leftlen-1);
}
if(leftlen+InStart<InEnd){
root->rchild = RebuildCode(PreStart+leftlen+1, PreEnd,
InStart+leftlen+1, InEnd);
}
return root;
}
//判断边界条件
BiNode* RebuildTree(char *Pre, char *In, int len)
{
if(Pre==NULL || In==NULL || len<=0){
return NULL;
}
else{
return RebuildCode(PreOrder, PreOrder+len-1,
InOrder, InOrder+len-1);
}
}
void Post(BiNode *root)
{
if(root->lchild != NULL){
PostOrder(root->lchild);
}
if(root->rchild != NULL){
PostOrder(root->rchild);
}
if(root != NULL){
cout<<root->data;
}
}
int main()
{
char Pre[maxx],In[maxx];
cin>>Pre>>In;
int len = strlen(Pre);
Post(RebuildTree(Pre,In,len));
return 0;
}