这道题按理说应该还是很水的。。但是要注意一个问题是我所没想到的:
满足左子树<根节点<右子树的才是二叉排序树,仅满足左儿子<根节点<右儿子的树不一定是二叉排序树的。
代码:
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
int a[1002],n,maxn,b[1002],tot;
inline bool gtrheap(){
for(int i=1;i<maxn;++i)
if(a[i]<a[i<<1]||(i<<1)+1<n&&a[i]<a[(i<<1)+1])
return 0;
return 1;
}
inline bool ltrheap(){
for(int i=1;i<maxn;++i)
if(a[i]>a[i<<1]||(i<<1)+1<n&&a[i]>a[(i<<1)+1])
return 0;
return 1;
}
inline void make(int x){
if(x<<1<n)make(x<<1);
b[tot++]=a[x];
if((x<<1)+1<n)make((x<<1)+1);
}
inline bool gtrbst(){
for(int i=2;i<n;++i)
if(b[i-1]<b[i])
return 0;
return 1;
}
inline bool ltrbst(){
for(int i=2;i<n;++i)
if(b[i-1]>b[i])
return 0;
return 1;
}
int main(){
int t,k,i;
bool heapflag,bstflag;
scanf("%d",&t);
for(k=1,++t;k<t;++k){
scanf("%d",&n);
maxn=(n>>1)+1;
for(i=1,++n;i<n;++i)scanf("%d",a+i);
heapflag=gtrheap()||ltrheap();
tot=1;
make(1);
bstflag=gtrbst()||ltrbst();
printf("Case #%d: ",k);
if(heapflag&&bstflag)printf("Both");
else
if(heapflag)printf("Heap");
else
if(bstflag)printf("BST");
else printf("Neither");
printf("\n");
}
}