自练代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2010;
struct node{
int lnode,rnode;
}no[maxn];
int tree[maxn]={0},m,n,num=0;
int judge(int tree[]){
int i=1;
if(tree[1]>=tree[2]){
while(i<=n/2){
int l=2*i,r=2*i+1;
if(tree[i]<tree[l]||(r<=n&&tree[i]<tree[r])){
return 0;
} else{
i++;
}
}
return 1;
} else if(tree[1]<tree[2]){
while(i<=n/2){
int l=2*i,r=2*i+1;
if(tree[i]>tree[l]||(r<=n&&tree[i]>tree[r])){
return 0;
} else{
i++;
}
}
return -1;
}
}
void postorder(int root){
if(root==-1) return ;
postorder(no[root].lnode);
postorder(no[root].rnode);
printf("%d",tree[root]);num++;
if(num!=n){
printf(" ");
} else printf("\n");
}
void post(int tree[]){
int i=1;
while(i<=n){
if(tree[i*2]!=0){
no[i].lnode=i*2;
} else {
no[i].lnode=-1;
}
if(tree[i*2+1]!=0){
no[i].rnode=i*2+1;
i++;
} else {
no[i].rnode=-1;
i++;
}
}
postorder(1);
}
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
num=0;
fill(tree,tree+maxn,0);
for(int j=1;j<=n;j++){
scanf("%d",&tree[j]);
}
if(judge(tree)==1){
printf("Max Heap\n");
post(tree);
} else if(judge(tree)==-1){
printf("Min Heap\n");
post(tree);
} else {
printf("Not Heap\n");
post(tree);
}
}
return 0;
}
某大神(薛玉洁)代码:
#include <iostream>
#include <vector>
using namespace std;
int m, n;
vector<int> v;
void postOrder(int index) {
if (index >= n) return;
postOrder(index * 2 + 1);
postOrder(index * 2 + 2);
printf("%d%s", v[index], index == 0 ? "\n" : " ");
}
int main() {
scanf("%d%d", &m, &n);
v.resize(n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) scanf("%d", &v[j]);
int flag = v[0] > v[1] ? 1 : -1;
for (int j = 0; j <= (n-1) / 2; j++) {
int left = j * 2 + 1, right = j * 2 + 2;
if (flag == 1 && (v[j] < v[left] || (right < n && v[j] < v[right]))) flag = 0;
if (flag == -1 && (v[j] > v[left] || (right < n && v[j] > v[right]))) flag = 0;
}
if (flag == 0) printf("Not Heap\n");
else printf("%s Heap\n", flag == 1 ? "Max" : "Min");
postOrder(0);
}
return 0;
}