题意:给出完全二叉树的层序排列,判断它是大根堆还是小根堆或者不是堆,再将原序列转为后序排列输出。
题解:首先判断是不是堆,可以dfs看子节点与父节点的大小关系,或者直接for循环判断,层序转后序直接dfs一下即可。
注意点:判断堆时逻辑关系要清楚,总体来说事一道简单的30分题。
code in view
// 层序转后序
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int n,m,a[maxn];
vector<int> ans;
void dfs(int x){
if(2*x<=n)
dfs(2*x);
if(2*x+1<=n)
dfs(2*x+1);
ans.push_back(a[x]);
}
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
ans.clear();
bool flagmax=true;
bool flagmin=true;
for(int j=1;j<=n;j++) cin>>a[j];
for(int j=2;j<=n;j++){//从2开始
if(a[j]>a[j/2]) flagmax=false;
if(a[j]<a[j/2]) flagmin=false;
}
if(flagmin){
printf("Min Heap\n");
}else{
printf("%s\n",flagmax==true?"Max Heap":"Not Heap");
}
dfs(1);
for(int j=0;j<ans.size();j++) printf("%d%c",ans[j],j==ans.size()-1?'\n':' ');
}
return 0;
}