对于该题,可以仅判断节点的子节点是都满足大顶堆或小顶堆的情况即可,后序遍历无需讲解。
由题可知,一个节点x的子节点为x $\times$2于x $\times$2+1俩节点,判断他们的关系即可。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int N=1010;
int value[N],idx;
int m,n;
bool Max_Heap()
{
for(int i=1;i<=n;i++)
{
if(i*2<=n)
if(value[i]<value[i*2])return false;
if(i*2+1<=n)
if(value[i]<value[i*2+1])return false;
}
return true;
}
bool Min_Heap()
{
for(int i=1;i<=n;i++)
{
if(i*2<=n)
if(value[i]>value[i*2])return false;
if(i*2+1<=n)
if(value[i]>value[i*2+1])return false;
}
return true;
}
void PreorderTraversal(int x)
{
if(x>n)return;
PreorderTraversal(2*x);
PreorderTraversal(2*x+1);
cout<<value[x]<<" ";
if(x==1)cout<<endl;
}
int main()
{
cin>>m>>n;
while(m--)
{
memset(value,0,sizeof(value));
for(int i=1;i<=n;i++)cin>>value[i];
if(Max_Heap())cout<<"Max Heap"<<endl;
else if(Min_Heap())cout<<"Min Heap"<<endl;
else cout<<"Not Heap"<<endl;
PreorderTraversal(1);
}
return 0;
}