题解:
相当于于对堆的基本应用
首先从2-n遍历,确定堆的类型
然后dfs后序遍历
Code:
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> v;
// 后续遍历树
void dfs(int k)
{
// 超过范围
if (k > M)
return;
dfs(k * 2);
dfs(k * 2 + 1);
printf("%d%s", v[k], (k == 1 ? "\n" : " "));
}
int main()
{
cin >> N >> M;
while (N--)
{
v.clear();
v.resize(M + 10);
for (int i = 1; i <= M; i++)
scanf("%d", &v[i]);
int max_t = 1;
int min_t = 1;
// 先确定是什么堆
for (int i = 2; i <= M; i++)
{
if (v[i] > v[i / 2])
min_t = 0;
if (v[i] < v[i / 2])
max_t = 0;
}
// 同时满足不可能
if (min_t == 0 && max_t == 0)
cout << "Not Heap";
else if (min_t == 0)
cout << "Min Heap";
else
cout << "Max Heap";
printf("\n");
dfs(1);
}
return 0;
}