check函数遍历堆,用path记录路径,在遍历到叶结点(叶结点条件:2*index>N) 时输出。
遍历的时候顺便比较一下父子大小判断是大顶堆还是小顶堆
#include<iostream>
#include<vector>
using namespace std;
int N;
vector<int> heap,path;
bool Max=true,Min=true;
void check(int index){
if(index>N){
return;
}
path.push_back(heap[index]);
if(2*index>N){
for(int i=0;i<path.size();i++){
if(i==0){
printf("%d",path[i]);
}else{
printf(" %d",path[i]);
}
}
printf("\n");
}
if(index!=1){
if(heap[index]<heap[index/2]) Min=false;
if(heap[index]>heap[index/2]) Max=false;
}
check(2*index+1);
check(2*index);
path.pop_back();
}
int main(){
cin>>N;
heap.resize(N+1);
for(int i=1;i<=N;i++){
scanf("%d",&heap[i]);
}
check(1);
if(Max){
printf("Max Heap\n");
}else if(Min){
printf("Min Heap\n");
}else{
printf("Not Heap\n");
}
return 0;
}