根据后序和中序遍历输出先序遍历

该博客介绍了如何通过后序和中序遍历来构造二叉树,并输出先序遍历。首先,从后序遍历的最后一个元素作为根节点开始,然后在中序遍历中找到该节点,根据中序遍历的顺序划分左子树和右子树,递归构造。博主分享了两种实现方式,一种通过构建二叉树结构,另一种直接通过递归输出先序遍历。

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

根据后序和中序遍历输出先序遍历

后序遍历+中序遍历---->>>>先序遍历
输入

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出

Preorder: 4 1 3 2 6 5 7

思路:*找规律,
由后序为主体,每一个入树的都是后序的,从后序结果最后一个开始入树,一个一个往前。
找到一个后序的就去中序结果中找这一个后序数字所在位置,分出左右,再入树,继续找…
代码如下

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct TNode* BinTree;
struct TNode
{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree CreatBintree(int n,int Late[],int Mid[])
{

    if(n<=0)
        return 0;
    else
    {
        BinTree Root=(BinTree)malloc(sizeof(struct TNode));
        Root->Data=Late[n-1];
        Root->Left=NULL;
        Root->Right=NULL;
        int i;
        for( i=0;i<n;i++)
        {
            if(Mid[i]==Late[n-1])
            break;
        }
        Root->Left=CreatBintree(i,Late,Mid);
        Root->Right=CreatBintree(n-i-1,Late+i,Mid+i+1);
        return Root;
    }

}
void PreorderTraversal(BinTree BT)
{
    if(BT==NULL)
        return;
    else
    {
        printf(" %d",BT->Data);
        PreorderTraversal(BT->Left);
        PreorderTraversal(BT->Right);
        return ;
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    int Late[n],Mid[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&Late[i]);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&Mid[i]);
    }
    BinTree BT;
    BT=CreatBintree(n, Late, Mid);
    printf("Preorder:");
    PreorderTraversal(BT);
}

今天又做了一道差不多的题,又想了想,不需要建树,想太多落入下乘了,题目只需要输出,去掉与树有关的
注意:我将int型换成char型了
代码:

#include <stdio.h>
#include <stdlib.h>
int n;
void CreatTree(int n,char after[],char mid[])
{
    if(n<0)
        return ;
    else
    {
        printf("%c",after[n]);
        int i;
        for(i=0;i<=n;i++)
        {
            if(mid[i]==after[n])
                break;
        }
        CreatTree(i-1,after,mid);
        CreatTree(n-i-1,after+i,mid+i+1);
        return ;
    }
}
int main()
{
    char after[1000];
    char mid[1000];
    scanf("%d",&n);
    scanf("%s",after);
    scanf("%s",mid);
    CreatTree(n-1,after,mid);
    return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

baibai___

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

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

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

打赏作者

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

抵扣说明:

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

余额充值