睡觉干饭睡觉 2021-06-23 16:39 采纳率: 50%
浏览 58
已结题

已知中序和后序求先序,这个要怎么改呀

/*根据二叉树的后序序列和中序序列建立该二叉树。这个过程是

 *一个递归过程,其基本思想是:先根据后序序列的最后一个元素建立

 *根节点,然后在中序序列中找到该元素,确定根节点的左、右子树的中序序列;

 *再在后序序列中确定左、右子树的后序序列;最后由左子树的后序序列与中序序列

 *建立左子树,由右子树的后序序列与中序序列建立右子树。

 */

#include <cstdio>

#include <cstdlib>

#include <string>

#include <iostream>

using namespace std;

 

string post, pin; //后序和中序序列(声明C++字符串)

 

typedef struct node

{ //树的节点

    char data;

    struct node *lchild;

    struct node *rchild;

} BiNode,*BiTree;

 

 

int find(char c, string pin, int pos) //查找根节点在中序序列中的位置

{

    for(int i=pos; pin[i]!='\0'; i++)

    {

        if(c==pin[i]) return i;

    }

    return -1;

}

 

//由后序和中序构造二叉树

void create(BiTree &root, int i1, int i2, int length)

{ /*i1为后序序列最后一个元素下标,i2为中序序列起始下标,

    length为序列长度*/

    if(length<=0)

        root=NULL;

    else

    {

        root = new BiNode;

        root->data = post[i1]; //根节点为后序序列中最后一个元素

        int pos = find(post[i1],pin,i2); //查找根节点在中序序列中的位置

        int leftlen = pos-i2; //左子树的长度

        int rightlen = length-(leftlen+1); //右子树的长度

        create(root->lchild, i1-1-rightlen, i2, leftlen); //递归建立左子树

        create(root->rchild, i1-1, pos+1, rightlen); //递归建立右子树

    }

}

void preOrder(BiTree T) //先序遍历二叉树

{

    if(T==NULL)

        return;

    else

    {

        cout<<T->data;

        preOrder(T->lchild);

        preOrder(T->rchild);

    }

}

 

int main()

{

    cin>>post>>pin;

    BiTree T;

    create(T,post.length()-1,0,post.length());

    preOrder(T);

    return 0;

}

  • 写回答

3条回答 默认 最新

  • shn_baby 2021-06-23 17:12
    关注

    我运行了你的代码,这个不是已经做到了吗?还有什么问题嘛?

    评论

报告相同问题?

悬赏问题

  • ¥15 js调用对象时报错,但是我看是有这个对象的,是不是调用方法不对
  • ¥15 可任意设置即使长度的倒计时器电路设计
  • ¥15 MusePose 部署安装问题,安装后无法启动
  • ¥15 Psexec获得电脑system权限该怎么操作,有偿
  • ¥50 python+flask实现流式api接口的问题
  • ¥20 关于#vue.js#的问题:后端返回的代码如下,根据后端返回的数据在页面上重新展示
  • ¥15 visual studio 社区版离线激活失败了
  • ¥15 Flask应用部署到阿里云服务器失败,无法访问网页,问题出在哪里?
  • ¥15 有什么好的直流步进减速电机42的厂家推荐,保持力矩达到0.3N.M
  • ¥15 一道蓝桥杯的题,请问我错在哪里