时间限制
400 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.
Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, first print in a line "YES" if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or "NO" if not. Then if the answer is "YES", print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input 1:
7
8 6 5 7 10 8 11
Sample Output 1:
YES
5 7 6 8 11 10 8
Sample Input 2:
7
8 10 11 8 6 7 5
Sample Output 2:
YES
11 8 10 7 5 6 8
Sample Input 3:
7
8 6 8 5 10 9 11
Sample Output 3:
NO
#include<stdio.h>
#include<stdlib.h>
/*效率太低,有待改进*/
int isBST(int *a,int count)
{
if(count==1 || count==0)
return 1;
int i,k;
for(i=1;i<count;i++)
{
if(a[i]<a[0])
continue;
break;
}
k=i-1;
for(;i<count;i++)
{
if(a[i]<a[0])
return 0;
}
if(isBST(a+1,k)==1 && isBST(a+k+1,count-k-1)==1)
return 1;
return 0;
}
int isMirror(int *a,int count)
{
if(count==1 || count==0)
return 1;
int i,k;
for(i=1;i<count;i++)
{
if(a[i]>=a[0])
continue;
break;
}
k=i-1;
for(;i<count;i++)
{
if(a[i]>=a[0])
return 0;
}
if(isMirror(a+1,k)==1 && isMirror(a+k+1,count-k-1)==1)
return 1;
return 0;
}
void postorder(int *a,int count,int level)
{
if(count==0)
return ;
if(count==1)
{
printf("%d",a[0]);
if(level!=0)
printf(" ");
return ;
}
int i,k;
for(i=1;i<count;i++)
{
if(a[i]<a[0])
continue;
break;
}
k=i-1;
postorder(a+1,k,level+1);
postorder(a+k+1,count-k-1,level+1);
printf("%d",a[0]);
if(level!=0)
printf(" ");
}
void postorderMirror(int *a,int count,int level)
{
if(count==0)
return ;
if(count==1)
{
printf("%d",a[0]);
if(level!=0)
printf(" ");
return ;
}
int i,k;
for(i=1;i<count;i++)
{
if(a[i]>=a[0])
continue;
break;
}
k=i-1;
postorderMirror(a+1,k,level+1);
postorderMirror(a+k+1,count-k-1,level+1);
printf("%d",a[0]);
if(level!=0)
printf(" ");
}
int main()
{
int n,i;
scanf("%d",&n);
int * a=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
if(isBST(a,n)==1)
{
printf("YES\n");
postorder(a,n,0);
}
else if(isMirror(a,n)==1)
{
printf("YES\n");
postorderMirror(a,n,0);
}
else
printf("NO\n");
free(a);
return 0;
}