题意:判断是最大堆还是最小堆或者不是堆
思路:直接分析i i*2 i*2+1之间的关系
注意点:输入的数字是在int范围内的所有数字,一开始的时候,我把数组置空成-1的然后错了好几个样例,回去看看题目,然后加了一个数组判断这个点是不是节点就可以了
#include<bits/stdc++.h>
using namespace std;
int tree[10050];
int isnode[10050];
int n,m;
int maxh(){
for(int i=m;i>1;i--){
if(tree[i/2]>=tree[i])
continue;
else
return 0;
}
return 1;
}
void printh(int i){
if(isnode[i*2]!=-1)
printh(i*2);
if(isnode[i*2+1]!=-1)
printh(i*2+1);
if(isnode[i]!=-1){
if(i==1)
cout<<tree[i]<<endl;
else
cout<<tree[i]<<" ";
}
}
int minh(){
for(int i=m;i>1;i--){
if(tree[i/2]<=tree[i])
continue;
else
return 0;
}
return 1;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
memset(isnode,-1,sizeof(isnode));
for(int j=1;j<=m;j++){
cin>>tree[j];
isnode[j]=1;
}
if(m==1){
cout<<"Not Heap\n";
printh(1);
continue;
}
int f=maxh();
if(f==1){
cout<<"Max Heap"<<endl;
printh(1);
continue;
}
f=minh();
if(f==1){
cout<<"Min Heap"<<endl;
printh(1);
continue;
}
cout<<"Not Heap"<<endl;
printh(1);
}
return 0;
}