题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1043
想法是根据给的数列建二叉树
根左子树右子树遍历
根右子树左子树遍历
若给的数列跟上述两个遍历得到的数列某个相等则YES,否则NO
C语言源码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Bitree
{
int data;
struct Bitree *lchild,*rchild;
}Bitree;
int A[1010],B[1010],C[1010],D[1010],topa,topb,topc,topd;
Bitree *create(Bitree *root,int x)
{
Bitree *q,*p;
p=(Bitree *)malloc(sizeof(Bitree));
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(!root)
return p;
else
{
q=root;
while((q->data>x&&q->lchild)||(q->data<=x&&q->rchild))
{
if(q->data>x)
q=q->lchild;
else
q=q->rchild;
}
if(q->data>x)
q->lchild=p;
else
q->rchild=p;
return root;
}
}
void Pre1(Bitree *root)
{
if(root)
{
A[topa++]=root->data;
Pre1(root->lchild);
Pre1(root->rchild);
}
}
void Pre2(Bitree *root)
{
if(root)
{
B[topb++]=root->data;
Pre2(root->rchild);
Pre2(root->lchild);
}
}
void Post1(Bitree *root)
{
if(root)
{
Post1(root->lchild);
Post1(root->rchild);
C[topc++]=root->data;
}
}
void Post2(Bitree *root)
{
if(root)
{
Post2(root->rchild);
Post2(root->lchild);
D[topd++]=root->data;
}
}
int main()
{
int n,i;
Bitree *root;
int s[1010];
int flag;
topa=0;topb=0;topc=0;topd=0;root=NULL;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
root=create(root,s[i]);
}
Pre1(root);
Pre2(root);
Post1(root);
Post2(root);
flag=0;
for(i=0;i<n;i++)
if(A[i]!=s[i])
break;
if(i==n)
flag=1;
for(i=0;i<n;i++)
if(B[i]!=s[i])
break;
if(i==n)
flag=2;
if(flag==1)
{
printf("YES\n");
for(i=0;i<n-1;i++)
printf("%d ",C[i]);
printf("%d\n",C[i]);
}
else
if(flag==2)
{
printf("YES\n");
for(i=0;i<n-1;i++)
printf("%d ",D[i]);
printf("%d\n",D[i]);
}
else
printf("NO\n");
return 0;
}