PAT-A 1147 Heaps
输入一个堆的层序序列判断它是不是一个最大(最小)堆。
众所周知,堆是个完全二叉树,它在顺序存储的时候储存序列即是层序序列。
所以,在遍历的时候判断一下即可,
#include<bits/stdc++.h>
using namespace std;
int a[2000];
bool f;
int sum;
int t,n;
void print(int x){
if(x>n)
return ;
print(x<<1);
print(x<<1|1);
if(sum==0){
cout<<a[x];
sum=1;
}
else
cout<<" "<<a[x];
}
bool ismax(int k){
if(k>n)
return 1;
if((k<<1)<=n&&a[k]<=a[k<<1])
return 0;
if((k<<1|1)<=n&&a[k]<=a[k<<1|1])
return 0;
return ismax(k<<1)&&ismax(k<<1|1);
}
bool ismin(int k){
if(k>n)
return 1;
if((k<<1)<=n&&a[k]>=a[k<<1])
return 0;
if((k<<1|1)<=n&&a[k]>=a[k<<1|1])
return 0;
return ismin(k<<1)&&ismin(k<<1|1);
}
int main(){
cin>>t>>n;
while(t--){
f=0;
sum=0;
for(int i=1;i<=n;i++)
cin>>a[i];
if(a[1]>a[2]){
if(ismax(1))
cout<<"Max Heap"<<endl;
else
cout<<"Not Heap"<<endl;
print(1);
cout<<endl;
}
else if(a[1]<a[2]){
if(ismin(1))
cout<<"Min Heap"<<endl;
else
cout<<"Not Heap"<<endl;
print(1);
cout<<endl;
}
else{
cout<<"Not Heap"<<endl;
print(1);
cout<<endl;
}
}
return 0;
}
(代码一点也不漂亮)