0
点赞
收藏
分享

微信扫一扫

A1147 Heaps (30 分| 堆| 树的遍历,附详细注释,逻辑分析)


写在前面

  • 思路分析
  • 判断是否为堆
  • 从第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;
}


举报

相关推荐

0 条评论