数据结构-二叉树(通过先序和中序或者是中序和后序得到二叉树)

先序序列:ABDEHJKLMNCFGI

中序序列:DBJHLKMNEAFCGI

后序序列:DJLNMKHEBFIGCA

#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
using namespace std;
typedef struct node
{
    char data;
    struct node* lchild;
    struct node* rchild;
}BTNode;
//根据先序和后序的序列求二叉树
BTNode* CreaBT1(char *pre,char *in,int n)  //pre表示前序序列,in表示中序序列
{
    BTNode *b;
    char *p;
    int k;
    if(n<=0)
        return NULL;
    b=(BTNode*)malloc(sizeof(BTNode));
    b->data=*pre;
    for(p=in;p<in+n;p++)
        if(*pre==*p)                        //在in中找到根节点的位置
            break;
    k=p-in;
    b->lchild=CreaBT1(pre+1,in,k);          //处理左子树
    b->rchild=CreaBT1(pre+k+1,p+1,n-k-1);   //处理右子树
    return b;
}
//根据中序和后序求二叉树
BTNode* CreaBT2(char *post,char *in,int n)   //post表示后序序列,in表示中序列
{
    BTNode *b;
    char *p,r;
    int k;
    r=*(post+n-1);
    if(n<=0)
        return NULL;
    b=(BTNode*)malloc(sizeof(BTNode));
    b->data=r;
    for(p=in;p<in+n;p++)
        if(*p==r)                            //在in中找到根节点的位置
            break;
    k=p-in;
    b->lchild=CreaBT2(post,in,k);
    b->rchild=CreaBT2(post+k,p+1,n-k-1);
    return b;
}
//输出二叉树
void DispBT(BTNode *b)
{
    if(b!=NULL)
    {
        cout<<b->data;
        if(b->lchild!=NULL||b->rchild!=NULL)
        {
            cout<<'(';
            DispBT(b->lchild);
            if(b->rchild!=NULL)
                cout<<',';
            DispBT(b->rchild);
            cout<<')';
        }
    }
}
int main()
{
    char s1[16],s2[16];
    BTNode *b;
    gets(s1);
    gets(s2);
    b=CreaBT1(s1,s2,strlen(s1));
    DispBT(b);
    cout<<endl;
    gets(s1);
    gets(s2);
    b=CreaBT2(s1,s2,strlen(s1));
    DispBT(b);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zw159357/article/details/79932353