解法:一次遍历,到达根结点递归输出结点
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <set>
#include <math.h>
#include <string.h>
#include <string>
#include <vector>
#include <map>
#define maxn 1010
using namespace std;
int n;
int levelorder[maxn];
bool f1=true,f2=true; // f1为大根堆,f2为小根堆
void to_print(int root,int h)
{
if(root!=1)to_print(root/2,h+1);
printf("%d",levelorder[root]);
if(h!=0)printf(" ");
else printf("\n");
}
void Traverse(int root)//顺序为:根右左
{
if(root<=n)
{
if(root!=1)//判断是否符合最大堆或者最小堆!
{
if(levelorder[root]>levelorder[root/2])f1=false;
if(levelorder[root]<levelorder[root/2])f2=false;
}
if(root*2>n)to_print(root,0);
Traverse(root*2+1);
Traverse(root*2);
}
}
int main()
{
//freopen("input.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",levelorder+i);
// printf("%d ",levelorder[i]);
}
Traverse(1);
if(f1)printf("Max Heap\n");
else if(f2)printf("Min Heap\n");
else printf("Not Heap\n");
}