984: 利用二叉树中序及先序遍历确定该二叉树的后序序列

该博客主要介绍了一种算法问题,即如何根据二叉树的中序遍历和先序遍历结果来唯一确定后序遍历。文中提供了一个C语言实现的函数`CreateBT1`用于根据输入的中序和先序遍历创建二叉树,并通过后序遍历输出。示例输入和输出展示了算法的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及先序遍历结果,要求输出其后序遍历结果。

输入
输入数据占2行,其中第一行表示中序遍历结果,第二行为先序遍历结果。

输出
对测试数据,输出后序遍历结果。

样例输入

BFDAEGC
ABDFCEG

样例输出

FDBGECA
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxSize 1000
typedef struct Node
{
    char data;
    struct Node *lchild;
    struct Node *rchild;
}BTnode;
BTnode *CreateBT1(char *pre,char *in,int n)
{
    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(*p==*pre)//找到后退出,p就是位置
        {
            break;
        }
    }
    k=p-in;
    //将总数据分为左右两部分,左边的为k个数据
    //右边是n-k-1(此处1是查到的那个值,不算进来)
    b->lchild=CreateBT1(pre+1,in,k);
    //往左边部分数据创建(左部分数据又会再分为左右部分数据)
    b->rchild=CreateBT1(pre+k+1,p+1,n-k-1);
    //往右边部分数据创建(左部分数据又会再分为左右部分数据)
    //参考教材229页
    return b;

}
void PreOrder(BTnode*root)
{
    if(root==NULL) return ;
    PreOrder(root->lchild);
    PreOrder(root->rchild);
    printf("%c",root->data);
}
int main()
{
    char pre[MaxSize];
    char in[MaxSize];
    scanf("%s",&in);
    scanf("%s",&pre);
    int n=strlen(in);//字符串长度为n
    BTnode *root;//根节点
    root=CreateBT1(pre,in,n);
    //依据先序序列和中序序列创建二叉树
    PreOrder(root);//后序遍历
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值