PAT 1147 Heaps (30 分)
原题链接
- 大致题意
- AC代码
1.给出完全二叉树,判断是否是堆,
是大根堆还是小根堆,然后依次输出后序遍历序列
(水题)
完全二叉树可以直接用数组存储,下标从0开始
假设当前点的编号为x
则左子树编号left=x*2+1
右子树编号right=x*2+2
2.AC代码
#include<bits/stdc++.h>
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()
{
#ifdef ONLINE_JUDGE
#else
{
freopen("12.txt","r",stdin);
}
#endif
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 flag=v[0]>v[1]?1:-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;
}
if(flag==0) printf("Not Heap\n");
else printf("%s Heap\n",flag==1?"Max":"Min");
postOrder(0);
}
return 0;
}
喵~