PAT甲级-1119 Pre- and Post-order Traversals (30 分)

题目:1119 Pre- and Post-order Traversals (30 分)
分析:二叉树,前序和后序判断是否唯一,输出中序
#include <iostream>
#include <vector>
#include <string.h>
#include<stdio.h>
using namespace std;
typedef struct node{
    int left = -1;
    int right = -1;
};
node node[31];
int pre[31];
int post[31];
int is_u = 1;
void build(int prel,int prer,int postl,int postr)
{
    if(prel>=prer)
        return ;
    int val = pre[prel+1];
    int index;
    for(int i = postl;i<=postr;i++)
    {
        if(val == post[i])
        {
            index = i;
            break;
        }
    }
    int num = index - postl;
    if(num == prer-prel-1)
        is_u = 0;
    node[prel].left = prel+1; // 不唯一  当做左孩子处理
    build(prel+1,prel+1+num,postl,index);
    if(prer-prel-1 != num) //唯一  有右孩子
    {
        node[prel].right = prel+1+num+1;
        build(prel+1+num+1,prer,index+1,postr);
    }
}
int first = 1;
void inorder(int root)
{
    if(root==-1)return ;
    inorder(node[root].left);
    if(first)
    {
        first = 0;
        printf("%d",pre[root]);
    }else
    {
        printf(" %d",pre[root]);
    }
    inorder(node[root].right);
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1;i<=n;i++)
        scanf("%d",&pre[i]);
    for(int i = 1;i<=n;i++)
        scanf("%d",&post[i]);
    build(1,n,1,n);
    if(is_u)
        printf("Yes\n");
    else
        printf("No\n");
    inorder(1);
    printf("\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值