AcWing 1640. 堆
原题链接
简单
C++ 代码
#include<iostream>
using namespace std;
const int N=1010;//输入输出流和字符串操作库
int n;//全局变量n存储节点数量
int h[N];//定义完全二叉树数组
void dfs(int u)//dfs后续遍历函数左右根
{
if(u*2<=n)dfs(u*2);//递归遍历左子树
if(u*2+1<=n)dfs(u*2+1);//递归遍历右子树
printf("%d",h[u]);//输出当前节点值
if(u!=1)printf(" ");//非根节点后输出空格
}
int main()
{
int T;
scanf("%d%d",&T,&n);//读入测试用例数量T和节点数量n
while(T--)//循环处理每个测试用例
{
for(int i=1;i<=n;i++)scanf("%d",&h[i]);//读入完全二叉树的层序遍历序列到数组h
bool lt=false,gt=false;//判断大小于
for(int i=1;i<=n;i++)//遍历节点
for(int j=0;j<2;j++)//辅助遍历左右子树
if(i*2+j<=n)//检查左右子树是否在范围内
{
int a=h[i],b=h[i*2+j];//将父子节点值分别赋值
if(a<b)lt=true;//判断大小根堆
else gt=true;//***注意:题目输入的节点数都不同
}
if(lt&>)puts("Not Heap");//大小根堆都有符合的部分就输入不是堆
else if(lt)puts("Min Heap");//
else puts("Max Heap");
dfs(1);//输入完根堆情况后从根节点数组下标递归
puts("");//***换行
}
return 0;
}