二叉树已知前序和中序求后序序列(C语言)(西工大数据结构)

二叉树已知前序和中序求后序序列(C语言)

题目

已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGDBHECA

大体思路

又先序得出根,先序的根后为左树一部分,我们再在中序序列里找到先序的根,此处之前即为左树(可以画图好好理解下),此处之后为右树。然后就是不断递归即可。

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100

typedef struct Node{
char data;
struct Node *Lchild;
struct Node *Rchild;
}BiTNode,*Bitree;

void PreTree(Bitree T)  //后序输出树
{   if(T==NULL) return;

     PreTree(T->Lchild);
     PreTree(T->Rchild);
     printf("%c",T->data);

}
char pre[MAX];
char mid[MAX];

int MidFind(int left,int right,char MID)  
{
    for(int i=left;i<=right;i++)
    {
        if(mid[i]==MID) return i;
    }
    return 0;
}

void Create(int left,int right,int *i,BiTNode **T)  //此题建立树得先将孩子结点赋NULL,因为没有用户输入以确定什么时候把某个具体的结点赋为NULL
{//这是第一种创建二叉树的写法(二级指针法)
//这种感觉是把指针送进函数处理
    *T=(Bitree)malloc(sizeof(BiTNode));
    (*T)->data=pre[*i];
    (*T)->Lchild=NULL; 
    (*T)->Rchild=NULL;
    (*i)++;
    int midnumber =  MidFind(left,right,(*T)->data);
    if(midnumber>left)
    {
        Create(left,midnumber-1,i,(&((*T)->Lchild)));
    }
    if(midnumber<right)
    {
        Create(midnumber+1,right,i,(&((*T)->Rchild)));
    }

}

BiTNode* Create2(int left,int right,int *i)
{//第二中创建方式(注意返回!!!)  
//这种感觉是把指针让函数处理(自己不进去)
BiTNode *T;
    T=(Bitree)malloc(sizeof(BiTNode));
    T->data=pre[*i];
    T->Lchild=NULL;
    T->Rchild=NULL;
    (*i)++;
    int midnumber =  MidFind(left,right,T->data);
    if(midnumber>left)
    {
        T->Lchild = Create2(left,midnumber-1,i);
    }
    if(midnumber<right)
    {
        T->Rchild = Create2(midnumber+1,right,i);
    }
    return T;

}
int main()
{
    memset(pre,0,MAX);
     memset(mid,0,MAX);
     gets(pre);
     gets(mid);
     int left,right,len,i=0;
     len=strlen(pre);
     left=0;
     right=len-1;

     BiTNode *T=(Bitree)malloc(sizeof(BiTNode));   //这里可以不用分配空间,因为在函数里会进行分配
     Create(left,right,&i,&T);

     PreTree(T);
     return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mcl19909949541

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值