题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805342821531648
题意
判断给定的某棵树的中序序列是大顶堆、小顶堆或者不是顶堆,并给出该树的后序序列(左右根)
题解
根据中序序列中,下标index对应的左节点为index * 2,右节点为index * 2+1的特性判断顶堆,同时运用递归按照左右根的顺序输出即可
AC代码
#include<bits/stdc++.h>
using namespace std;
int a[1001],m,n;
void postorder(int index)
{
if(index>n) return;
postorder(index*2);
postorder(index*2+1);
printf("%d%s",a[index],index==1?"\n":" ");
}
int main()
{
scanf("%d %d",&m,&n);
while(m--)
{
int maxn=1,minn=1;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=2;i<=n;i++)
{
if(a[i/2]>a[i]) minn=0;// a[i/2]为根节点,a[i]为子节点
if(a[i/2]<a[i]) maxn=0;
}
if(maxn) printf("Max Heap\n");
else if(minn) printf("Min Heap\n");
else printf("Not Heap\n");
postorder(1);
}
}