#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int v;
node * r,*l;
};
int m,n,num = 0;
int level[1010];
void inorder(int i,node *& root){
if(i > n) return;
if(root == NULL){
root = new node();
root->v = level[i];
root->r = root->l = NULL;
}
inorder(2*i,root->l);
inorder(2*i+1,root->r);
}
bool ismax(node * root){
if(root == NULL) return true;
if((root->l != NULL)&&(root->v <= root->l->v) || (root->r != NULL)&&(root->v <= root->r->v))
return false;
return ismax(root->l) && ismax(root->r);
}
bool ismin(node * root){
if(root == NULL) return true;
if((root->l != NULL) &&(root->v >= root->l->v) || (root->r != NULL)&&(root->v >= root->r->v))
return false;
return ismin(root->l) && ismin(root->r);
}
void post(node * root){
if(root == NULL) return;
post(root->l);
post(root->r);
printf("%d%s",root->v,num == n-1? "\n":" ");
num++;
}
int main()
{
scanf("%d %d",&m,&n);
for(int i = 0; i < m; i++){
for(int j = 1; j <= n; j++){
scanf("%d",&level[j]);
}
node * root = NULL;
inorder(1,root);
if(ismax(root)) printf("Max Heap\n");
else if(ismin(root)) printf("Min Heap\n");
else printf("Not Heap\n");
num = 0;
post(root);
}
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
int m,n,num = 0;
int level[1010];
void post(int i){
if(i > n) return;
post(i * 2);
post(i * 2 + 1);
printf("%d%s",level[i],i == 1? "\n":" ");
}
int main()
{
scanf("%d %d",&m,&n);
for(int i = 0; i < m; i++){
for(int j = 1; j <= n; j++){
scanf("%d",&level[j]);
}
int flag = level[1] > level[2] ? 1:-1;
for(int j = 1; j <= n/2; j++){
int l = j *2,r = j*2 + 1;
if(flag == 1 && (level[l] > level[j] || (r <= n && level[r] > level[j])) ) flag = 0;
if(flag == -1 && (level[l] < level[j] || (r <= n && level[r] < level[j])) ) flag = 0;
}
if(flag == 0) printf("Not Heap\n");
else printf("%s Heap\n",flag == 1 ?"Max":"Min");
post(1);
}
return 0;
}
柳神29行代码搞定 没有建树 完全利用完全二叉树的性质 2i是做孩子 2i+1是右孩子 完全利用 for循环