由二叉树的前序和中序得到后序

由二叉树的前序和中序得到后序的问题

基本思想:前序、中序=>二叉树=>后序

由前序得到第一个根节点;
找出中序中此根节点的位置,将二叉树分成了左子树和右子树;
左子树和右子树又可以看作新的二叉树…
直至左子树和右子树为叶子终止。

例如:
前序: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值