常规解题:
#include<iostream>
#include<vector>
using namespace std;
int m, n, temp;
vector<int> level;
bool check1() {
for(int i = n/2 - 1; i >=0 ; i--) {
if(2 * i + 1 < n) {
if(level[i] < level[2 * i + 1]) return false;
if(2 * i + 2 < n)
if(level[i] < level[2 * i + 2]) return false;
}
}
return true;
}
bool check2() {
for(int i = n/2 - 1; i >=0 ; i--) {
if(2 * i + 1 < n) {
if(level[i] > level[2 * i + 1]) return false;
if(2 * i + 2 < n)
if(level[i] > level[2 * i + 2]) return false;
}
}
return true;
}
int num;
void postOrder(int x) {
if(x >= n) return ;
postOrder(2 * x + 1);
postOrder(2 * x + 2);
if(num++) cout << " ";
cout << level[x];
}
int main() {
cin >> m >> n;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >> temp;
level.push_back(temp);
}
if(check1()) cout << "Max Heap" << endl;
else if(check2()) cout << "Min Heap" << endl;
else cout << "Not Heap" << endl;
num = 0;
postOrder(0);
cout << endl;
level.clear();
}
return 0;
}
精简代码:(巧妙之处在于对于小标的巧用,即堆的判断)
#include<iostream>
using namespace std;
int m, n, temp, num, level[1010];
void postOrder(int x) {
if(x >= n) return ;
postOrder(2 * x + 1);
postOrder(2 * x + 2);
if(num++) cout << " ";
cout << level[x];
}
int main() {
cin >> m >> n;
for(int i = 0; i < m; i++) {
int maxHeap = 1, minHeap = 1;
for(int j = 1; j <= n; j++) {
cin >> level[j];
if(j > 1 && level[j / 2] < level[j]) maxHeap = 0;
if(j > 1 && level[j / 2] > level[j]) minHeap = 0;
}
if(maxHeap) cout << "Max Heap" << endl;
else if(minHeap) cout << "Min Heap" << endl;
else cout << "Not Heap" << endl;
num = 0;
postOrder(0);
cout << endl;
}
return 0;
}