7-1 根据后序和中序遍历输出先序遍历 (25 分)

11 篇文章 1 订阅

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:
在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

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<malloc.h>
#include<stdlib.h>
typedef int ElemType;

typedef struct LinkStack
{
    struct LinkStack *next;
    ElemType data;
} LinkStack,*Linkstack;
typedef struct BiTree
{
    struct BiTree *lchild,*rchild;
 //   struct BinTree;
    int data;
} BTNode,*Bitree;
typedef struct NumList
{
    int data;  //储存的值
    int n;     //在后序中的次序
} NumList;
int InitList(NumList s[],int p)
{
    int mm[p+2];
    int a;
    for(int i=0;i<p;i++)
    {
        scanf("%d",&a);
        mm[a]=i;
    }
    for(int i=0;i<p;i++)
    {
        scanf("%d",&a);
        s[i].data=a;
        s[i].n=mm[a];
    }
}
int Findmax(NumList *s,int p,int q)
{
    int ma=0;
    int y=0;
   // printf("寻找函数p,q:%d %d\n",p,q);
    for(int i=p;i<q;i++)
    {
        if(s[i].n>=ma)
        {
            ma=s[i].n;
            y=i;
        }
    }
    //printf("寻找函数输出y:%d\n",y);
    // printf("222\n");
   //  printf("%d\n",y);
    return y;
}
int Tree(Bitree t,NumList *m,int p,int q)   //左闭右开
{
    if(p==q)
        return 0;
    else
    {
        int d;
        int f;
        d=Findmax(m,p,q);
        //printf("%d ",d);
       //  printf("%d\n",m[d].data);
        //t->data
        f=m[d].data;
        t->data=f;
     //   printf("%d %d  666\n",p,q);
     //   printf("333%d %d\n",t->data,d);

        if(d!=p)
        {
            t->lchild=(Bitree)malloc(sizeof(BTNode));
            t->lchild->lchild=NULL;
            t->lchild->rchild=NULL;
        }
        else
        {
            t->lchild=NULL;
       //     printf("我是叶子%d ,我左浮空\n",t->data);
        }
        if(d!=q-1)
        {
            t->rchild=(Bitree)malloc(sizeof(BTNode));
           t->rchild->rchild=NULL;
           t->rchild->lchild=NULL;
        }
        else
        {
            t->rchild=NULL;
    //        printf("我是叶子%d ,我右浮空\n",t->data);
        }

        Tree(t->lchild,m,p,d);
        Tree(t->rchild,m,d+1,q);




    }
}
int Print(Bitree t)
{
    static int mff=0;
   // printf(" %d",t->data);
    if(!t)
    {
        return 0;
    }
    else
    {
        if(mff==0)
        {
            printf("%d",t->data);
            mff++;
        }

        else
            printf(" %d",t->data);
        Print(t->lchild);
        Print(t->rchild);
    }
}
int main()
{
    int mf;
    scanf("%d",&mf);
    Bitree t;
    t=(Bitree)malloc(sizeof(BTNode));
    //t->data=2;
   // printf("11 %d\n",t->data);
    NumList m[mf+2];
    InitList(m,mf);
//    for(int i=0;i<mf;i++)
//    {
//        printf(" %d",m[i].n);
//    }
   // printf("111\n");
    Tree(t,m,0,mf);
    printf("Preorder: ");
    Print(t);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值