二叉树,已知先序和中序求后序,已知后序和中序求先序

/*根据二叉树的前序序列和中序序列建立该二叉树。这个过程是
 *一个递归过程,其基本思想是:先跟据前序序列的第一个元素建立
 *根节点,然后在中序序列中找到该元素,确定根节点的左、右子树的中序序列;
 *再再前序序列中确定左、右子树的前序序列;最后由左子树的前序序列与中序序列
 *建立左子树,由右子树的前序序列与中序序列建立右子树。
 *(由后序和中序建立二叉树的思想与上面类似)
 */
#include <cstdio>
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;

string pre, pin;    //先序和中序序列

typedef struct node {   //树的节点
    char data;
    struct node *lchild;
    struct node *rchild;
} BiNode,*BiTree;

int find(BiNode *T, string pre, int pos);   //查找根节点在中序序列中的位置
void create(BiTree &root, int i1, int i2, int length);  //根据先序和中序序列创建二叉树
void postOrder(BiTree T);   //后序遍历二叉树

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 = (BiNode *)malloc(sizeof(BiNode));
        root->data = pre[i1];               //根节点为线序序列中第1个元素
        int pos = find(pre[i1],pin,i2);     //查找根节点在中序序列中的位置
        int leftlen = pos-i2;               //左子树的长度
        int rightlen = length-(leftlen+1);  //右子树的长度
         create(root->lchild, i1+1, i2, leftlen);   //递归建立左子树
        create(root->rchild, i1+leftlen+1, pos+1, rightlen);    //递归建立右子树
    }
}
/*由后序和中序构造二叉树
void create(BiTree &root, int i1, int i2, int length){     //i1为后序序列最后一个元素下标(其他同上)
    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 postOrder(BiTree T){
    if(T==NULL) return;
    else{
        postOrder(T->lchild);
        postOrder(T->rchild);
        cout<<T->data<<' ';
    }
}

int main(){
    cin>>pre>>pin;
    BiTree T;
    create(T,0,0,pre.length());
    postOrder(T);
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值