1147 Heaps (30分)
题目大意:给定一个完全二叉树的层序遍历,要求判断其是否为堆,并输出后序遍历结果。
判断是否为堆,先确定为最大堆还是最小堆(比较开始的两个元素),再比较各个元素与其左右孩子的大小关系。
柳婼大神只用了25行代码解决!(传送门,学到了,还是要多看看大神的题解哒~)
#include<iostream> //输入输出流头文件
#include<vector> //变长数组容器
using namespace std; //标准命名空间
int m,n,ismaxHeap=1;
vector<int> v,postorder;
int isHeap();
void postOrder(int r);
int main(){ //主函数
#ifdef ONLINE_JUDGE //如果有oj系统(在线判定),则忽略文件读入,否则使用文件作为标准输入
#else
freopen("1.txt", "r", stdin); //从1.txt输入数据
#endif
cin>>m>>n;
v.resize(n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>v[j];
}
if(v[0]<v[1]) ismaxHeap=0;
if(isHeap())cout<<(ismaxHeap?"Max Heap":"Min Heap")<<endl;
else cout<<"Not Heap"<<endl;
postOrder(0);
for(int k=0;k<n;k++){
cout<<postorder[k];
if(k<n-1)cout<<' ';
else {cout<<endl;postorder.clear();}
}
ismaxHeap=1;
}
return 0; //返回0,如果不返回0,PAT会报错
}
bool notHeap(int fa,int ch){
if(ismaxHeap==1) return ch>fa;//如果是最大堆且孩子大于父亲
else return ch<fa;
}
int isHeap(){
for(int i=0;i*2+1<n;i++){
if(notHeap(v[i],v[i*2+1])){return 0;}
if(i*2+2<n){
if(notHeap(v[i],v[i*2+2])){return 0;}
}
}
return 1;
}
void postOrder(int r){
if(r>=n)return ;
postOrder(r*2+1);
postOrder(r*2+2);
postorder.push_back(v[r]);
}