03-树3 Tree Traversals Again

这里写图片描述
这里写图片描述
这道题有两种解法,第一种解法是根据先序和后序遍历建立二叉树,然后再后序遍历二叉树,详情见5-23还原二叉树
第二种方法是直接根据先序和后续遍历直接求出后序遍历数据,不需要建树。
这里写图片描述这里写图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30
typedef struct tree *Bintree;
struct tree
{
    int data;
    Bintree left;
    Bintree right;
};

typedef struct node
{
    int data[MAX];
    int top;
}stack;
stack *createstack()
{
    stack *s;
    s=malloc(sizeof(stack));
    s->top=-1;
    return s;
}
void push(stack *s,int item)
{
       s->data[++s->top]=item;
}
int pop(stack *s)
{
    return s->data[s->top--];
}
Bintree createtree(int pre[],int in[],int N)
{
    Bintree T;
    int i;
    if(!N)return NULL;
    T=malloc(sizeof(struct tree));
    T->data=pre[0];
    for(i=0;i<N;i++)
    {
        if(pre[0]==in[i])break;
    }
    T->left=createtree(pre+1,in,i);
    T->right=createtree(pre+i+1,in+i+1,N-i-1);

    return T;
}
void postorder(Bintree T)
{
    if(T)
    {
        postorder(T->left);
        postorder(T->right);
        printf("%d ",T->data);
    }
}
void solve(int pre[],int in[],int post[],int prel,int inl,int postl,int length)
{
    int root,i,L,R;
    if(length==0)//注意递归后的节点只存在一个子节点的情况,另一边length就等于0
        return;
    if(length==1)
    {
        post[postl]=pre[prel];
        return;
    }
    root=pre[prel];
    post[postl+length-1]=root;
    for(i=0;i<length;i++)
        if(in[inl+i]==root)
            break;
    L=i;
    R=length-i-1;
    solve(pre,in,post,prel+1,inl,postl,L);//左子树
    solve(pre,in,post,prel+L+1,inl+L+1,postl+L,R);//右子树
}

main()
{
    stack *q;
    char str[10];
    int pre[10],in[10],post[10],N,i,a=0,b=0,x;
    q=createstack();
    scanf("%d",&N);
    for(i=0;i<2*N;i++)
    {
        scanf("%s",str);
        if(str[1]=='u')//if(str[1]=='u')
        {
            scanf("%d",&x);
            pre[a++]=x;
            push(q,x);
        }
        else
           in[b++]=pop(q);
    }
    solve(pre,in,post,0,0,0,N);
    for(i=0;i<N-1;i++)
        printf("%d ",post[i]);
    printf("%d\n",post[N-1]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值