PAT_A1147
PAT甲级1147.
目录
A1147
题目
样例
输入:
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
输出:
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<bits/stdc++.h>
using namespace std;
int n,m; //m组数据,n个数值
int cnt=0; //格式控制计数器
vector<int> v; //存放序列
void Judge(); //判断堆
void getpos(int root); //后序序列
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
scanf("%d%d",&m,&n);
v.resize(n);
for(int i=0;i<m;i++) //依次判断每组数据
Judge();
return 0;
}
void Judge(){
cnt=0;
for(int i=0;i<n;i++)
scanf("%d",&v[i]); //创建序列,并使用库函数直接判断是不是堆,需要C++11及以上标准支持
if(is_heap(v.begin(),v.end(),less<int>()))
puts("Max Heap");
else if(is_heap(v.begin(),v.end(),greater<int>()))
puts("Min Heap");
else
puts("Not Heap");
getpos(0); //后序序列
putchar('\n');
}
void getpos(int root){ //递归后序遍历
if(root>=n) return; //遇到空结点这返回
getpos(root*2+1); //下标从0开始则2n+1为左子树,2n+2为右子树
getpos(root*2+2);
if(cnt) putchar(' ');
printf("%d",v[root]); //输出当前结点
cnt++;
}