题目描述
知识点
树、完全二叉树以及堆的性质
实现
码前思考
- 完成二叉树的静态实现特征是本题的关键,感觉使用结构体,可能会超时呢~~
代码实现
//不需要建树直接根据完全二叉树的性质使用
//数组下标从1开始
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e3+10;
int m;
int n;
int data[maxn];
vector<int> post;
bool isHeap;
void checkMax(int root){
//超出边界直接return
if(root > n){
return;
}else{
//首先判断是否是大顶堆
int l=2*root;
int r=2*root+1;
if(l<=n && data[l]>data[root]){
isHeap = false;
}
if(r<=n && data[r]>data[root]){
isHeap = false;
}
checkMax(l);
checkMax(r);
post.push_back(data[root]);
return;
}
}
void checkMin(int root){
//超出边界直接return
if(root > n){
return;
}else{
//首先判断是否是大顶堆
int l=2*root;
int r=2*root+1;
if(l<=n && data[l]<data[root]){
isHeap = false;
}
if(r<=n && data[r]<data[root]){
isHeap = false;
}
checkMin(l);
checkMin(r);
post.push_back(data[root]);
return;
}
}
int main(){
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++){
for(int j=1;j<=n;j++){
scanf("%d",&data[j]);
}
isHeap = true;
post.clear();
//首先来看预先是max heap,还是min heap
if(data[1] > data[n]){
checkMax(1);
if(isHeap == true){
printf("Max Heap\n");
}else{
printf("Not Heap\n");
}
}else{
checkMin(1);
if(isHeap == true){
printf("Min Heap\n");
}else{
printf("Not Heap\n");
}
}
for(int j=0;j<n;j++){
printf("%d",post[j]);
if(j<post.size()-1){
printf(" ");
}else{
printf("\n");
}
}
}
return 0;
}
码后反思
-
柳神的代码,她将判断放在读入里了
#include <iostream> using namespace std; int a[1005], m, n; void postOrder(int index) { if (index > n) return; postOrder(index * 2); postOrder(index * 2 + 1); printf("%d%s", a[index], index == 1 ? "\n" : " "); } int main() { scanf("%d %d", &m, &n); while (m--) { int minn = 1, maxn = 1; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 2; i <= n; i++) { if (a[i] > a[i / 2]) maxn = 0; if (a[i] < a[i / 2]) minn = 0; } if (maxn == 1) printf("Max Heap\n"); else if (minn == 1) printf("Min Heap\n"); else printf("Not Heap\n"); postOrder(1); } return 0; }