原题:https://pintia.cn/problem-sets/994805342720868352/problems/994805342821531648
首先建堆,然后判断是最大还是最小,之后post order traversal。但是我的代码有一个数据总是过不了,实在不知道为啥。最后我给出了柳婼大神的代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include<stack>
#include<queue>
#include<sstream>
using namespace std;
/*
A1147 Heaps (30 分)
首先建堆,然后判断是最大还是最小,之后post order traversal
*/
const int MaxN = 1100;
typedef int ElemT;
struct node {
ElemT key;
int Lc=-1;
int Rc=-1;
};
node T[MaxN];
//N个元素
string PrintHeap(int N) {
if (T[0].key >= T[1].key) {
int i = 0;
for (; 2 * i < N; i++) {
//Left Child
if (T[i].Lc != -1 && T[i].key < T[2 * i + 1].key) break;
//Right Child
if (T[i].Rc != -1 && T[i].key < T[2 * i + 2].key) break;
}
if(2*i==N) return "Max Heap";
}
if (T[0].key <= T[1].key) {
int i = 0;
for (; 2 * i < N; i++) {
//Left Child
if (T[i].Lc != -1 && T[i].key > T[2 * i + 1].key) break;
//Right Child
if (T[i].Rc != -1 && T[i].key > T[2 * i + 2].key) break;
}
if (2 * i == N) return "Min Heap";
}
return "Not Heap";
}
void PostOr(int NowN, vector <ElemT> &po) {
if (NowN == -1)
return;
if (T[NowN].Lc != -1)
PostOr(T[NowN].Lc, po);
if (T[NowN].Rc != -1)
PostOr(T[NowN].Rc, po);
po.push_back(T[NowN].key);
}
int main() {
//freopen("input.txt", "r", stdin);
//M (≤ 100), the number of trees to be tested; \
and N (1 < N ≤ 1,000),the number of keys in each tree
int M, N;
cin >> M >> N;
//孩子坐标
for (int i = 0; i < N; i++) {
if (2 * i + 1 < N) {
T[i].Lc = 2 * i + 1;
}
if (2 * i + 2 < N) {
T[i].Rc = 2 * i + 2;
}
}
//Input
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cin >> T[j].key;
}
cout << PrintHeap(N) << endl;
vector<ElemT> po;
PostOr(0, po);
for (int kk = 0; kk < N; kk++) {
cout << po[kk];
if (kk < N - 1)
cout << " ";
else
cout << "\n";
}
}
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;
}