//PAT 1155
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
//全局变量与局部变量要分清
int n,a[1009],ismin=1,ismax=1;//输入: n 结点个数 ,a层序遍历数组值 ,判断堆的逻辑判断值
void dfs(int j)
{
//终止条件
if(j*2>n&&j*2+1>n)
{
if(j<=n)//让只有左节点没有右节点的情况打印不出来 (进入到vector中特判不让其打印出)
{for(int i=0;i<v.size();i++)
//输出格式(最后一个元素是换行) 1.前面代表必须加双引号,后面输入如果是字符也要加双引号
printf("%d%s",v[i],i!=v.size()-1?" ":"\n");
}
}
else{
//会先将根节点放入vector中,所以只需考虑他的左右孩子该不该入vector中即可
v.push_back(a[2*j+1]);
dfs(j*2+1);
v.pop_back();
//在以他为根节点进行递归 (注意入的是那个数)
v.push_back(a[2*j]);
dfs(2*j);
v.pop_back();
}
}
int main()
{
cin>>n;
//从一开始是因为要对应树的性质根节点的标号是从1开始
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
v.push_back(a[1]);
dfs(1);
//从第二个开始检验未必是第一个,根节点上面是没有元素的(注意)
for(int i=2;i<=n;i++)
{
if(a[i]>a[i/2]) ismax=0;
if(a[i]<a[i/2]) ismin=0;
}
if(ismin==1)
{ //Finally print in a line Max Heap if it is a max heap, or Min Heap for a min heap, or Not Heap if it is not a heap at all.
printf("Min Heap");
}
else printf("%s",ismax==1?"Max Heap":"Not Heap");
return 0;
}
总结:
1.根节点上面是没有元素的带不带根节点进行操作要想清楚(检验堆从第二个元素开始而不是根节点)
2.dfs是以当前节点为根节点探索子树
3.输出格式尤其是让你打出特定的结果直接把那一段复制到注释里进行分析
单词
问题
先中后树的遍历到底如何实现