根据先序遍历和中序遍历 重构二叉树 ,进行后序遍历 输出

//根据先序遍历和中序遍历 重构二叉树
#include <cstdio>
#include <string>
using namespace std;

struct TreeNode{
    char data;
    TreeNode * leftChild;
    TreeNode * rightChild;
};

TreeNode * rebuild(string preOrder,string inOrder){
    //rebuild 的返回值表示子树的根节点的地址
    if(preOrder.size() == 0){
        return NULL;
    }
    else{
        char rootdata = preOrder[0];
        TreeNode *pNewNode  = new TreeNode;
        pNewNode->data = rootdata; //子树的根建好了

        //拿根去切割中序
        int pos = inOrder.find(rootdata);//pos是根在中序序列中出现的下标
        // preOrder.substr(1,pos);//将preorder切割,取出从下标1开始长度为pos的子串 //先序的
        // preOrder.substr(pos+1);//将preorder切割,取出从下标pos+1开始,到结束位置的子串
        // inOrder.substr(0,pos);  //中序的
        // inOrder.substr(pos+1);
        /*
         * 先序 a bcdgfe
         * 中序 b a dfgce
         * 确定a是根 ,得到左右子树的结点数  ;把大问题变成小问题
         */
        pNewNode->leftChild = rebuild(preOrder.substr(1,pos),inOrder.substr(0,pos));
        pNewNode->rightChild = rebuild(preOrder.substr(pos+1),inOrder.substr(pos+1));
        return pNewNode;
    }
}
void postOrder(TreeNode *root){
    if(root == NULL){
        return;
    }
    postOrder(root->leftChild);
    postOrder(root->rightChild);
    printf("%c",root->data);
}

int main(){
    char preOrder[30];
    char inOrder[30]; //申请两个数组
    while (scanf("%s%s",preOrder,inOrder) != EOF){
        TreeNode * root = rebuild(preOrder,inOrder); //申请一个根结点
        postOrder(root);
        printf("\n");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值