分析:二叉树,前序和后序判断是否唯一,输出中序
#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;
}