写在前面
- 思路分析
- 判断是否为堆
- 从第2个节点开始遍历
- 比父节点小,不是小顶堆
- 比父节点大,不是大顶堆
- 后序遍历,根据index分别遍历index2和index2+1,即左右孩子
- 遍历完左右子树,最后输出根结点
- 有点儿经验,进阶ing
测试用例
input:
3 8
98 72 86 60 65 12 23 50
8 38 25 58 52 82 70 60
10 28 15 12 34 9 8 56
output:
Max Heap
50 60 65 72 12 23 86 98
Min Heap
60 58 52 38 82 70 25 8
Not Heap
56 12 34 28 9 8 15 10
ac代码
- 参考链接
#include <iostream>
#include <vector>
using namespace std;
int m, n;
vector<int> v;
void postOrder(int index)
{
if(index>n) return;
postOrder(index*2);
postOrder(index*2+1);
// index == 1 根节点
printf("%d%s", v[index], index==1 ? "\n" : " ");
}
int main()
{
scanf("%d%d", &m,&n);
v.resize(n);
for(int i=0; i<m; i++)
{
for(int j=1; j<=n; j++) scanf("%d", &v[j]);
int isMin = 1, isMax = 1;
for(int j=2; j<=n; j++)
{
if(v[j/2]>v[j]) isMin = 0;
if(v[j/2]<v[j]) isMax = 0;
}
if(isMin==0 && isMax==0) printf("Not Heap\n");
else printf("%s Heap\n", isMax == 1 ? "Max" : "Min");
postOrder(1);
}
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 isMin = 1, isMax = 1;
for(int j=1; j<n; j++)
{
if(v[(j+1)/2-1]>v[j]) isMin = 0;
if(v[(j+1)/2-1]<v[j]) isMax = 0;
}
if(isMin==0 && isMax==0) printf("Not Heap\n");
else printf("%s Heap\n", isMax == 1 ? "Max" : "Min");
postOrder(0);
}
return 0;
}
- 不同下标不同判断方式(
堆类型
)
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;
}