题目链接: PAT【甲级】1155
题目简述:按完全二叉树层次遍历的方式,给定一行数字。要求去判断给定的这些数字(也即这个二叉树)是不是个二叉堆,如果是堆是最大堆还是最小堆。
#include<iostream>
#include<vector>
using namespace std;
int n;
int a[1001];
int smallerthanchild;//比孩子小的叶结点
int biggerthanchild;//比孩子大的
void traverse(int curdex,vector<int>&path){
path.push_back(a[curdex]);
if(curdex*2<=n){//非叶结点
if(curdex*2+1<=n){//存在右子树
//向右递归
//看看他和他孩子
if(a[curdex*2+1]>a[curdex])//比他孩子小
{
smallerthanchild++;
}
if(a[curdex*2+1]<a[curdex])//比他孩子大
{
biggerthanchild++;
}
traverse(curdex*2+1,path);
}
//肯定都得向左递归
if(a[curdex*2]>a[curdex])//比他孩子小
{
smallerthanchild++;
}
if(a[curdex*2]<a[curdex])//比他孩子大
{
biggerthanchild++;
}
traverse(curdex*2,path);
}
else{//无左子树,叶节点
for(int i=0;i<path.size();i++){
if(i)cout<<" ";//控制输出
cout<<path[i];
}
cout<<endl;
}
path.pop_back();
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
vector<int>path;
traverse(1,path);
if(!smallerthanchild)cout<<"Max Heap"<<endl;
else if(!biggerthanchild)cout<<"Min Heap"<<endl;
else cout<<"Not Heap"<<endl;
return 0;
}