本题思路:
层序遍历建树;
建树的同时通过两个flag的值,flag1为大顶堆成立,flag2为小顶堆成立,判断的时候如果既是大顶堆又是小顶堆,说明不是堆;
后序遍历节点;
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1010;
int a[maxn],num,n,m;
bool flag,flag1,flag2;
struct node
{
int data;
node *lc,*rc;
};
node* level(int index)
{
if(index>n)return NULL;
node* root=new node;
root->data=a[index];
if(index*2<=n)
{
if(a[index]>=a[index*2])
flag1=true;
else
flag2=true;
}
if(index*2+1<=n)
{
if(a[index]>=a[index*2+1])
flag1=true;
else
flag2=true;
}
root->lc=level(2*index);
root->rc=level(2*index+1);
return root;
}
void post(node *root)
{
if(root==NULL)return ;
post(root->lc);
post(root->rc);
printf("%d",root->data);
num++;
if(num!=n)
printf(" ");
else
printf("\n");
}
int main()
{
cin>>m>>n;
for(int i=0;i<m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[j]);
}
flag1=false;
flag2=false;
node* root=level(1);
if(flag1==true&&flag2==false)
{
printf("Max Heap\n");
}
else if(flag2==true&&flag1==false)
{
printf("Min Heap\n");
}
else
{
printf("Not Heap\n");
}
num=0;
post(root);
}
}