这题大致是两个步骤,第一步是判断大根堆,小根堆和不是堆;第二步是后序遍历输出。
- 对于第一步,首先定义两个变量maxh
和minh
,分别来记录结点和左右儿子的大小情况,依次遍历树的结点,如果结点的值>儿子结点的值,则maxh=true
,否则minh=true
;如果maxh
和minh
同时为true
,则不是堆,如果只有maxh
为true
则大根堆,如果只有minh
为true
则为小根堆;
- 第二步是一个模板!
代码
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N = 1010;
int heap[N];
int T,n;
void dfs(int u){
if(u*2<=n) dfs(2*u);
if(u*2+1<=n) dfs(2*u+1);
printf("%d",heap[u]);
if(u!=1) printf(" ");
}
int main(){
cin>>T>>n;
while(T--){
bool maxh=false,minh=false;
for(int i=1;i<=n;i++) cin>>heap[i];
//错误的写法
// for(int i=1;i*2+1<=n;i++){
// if(heap[i]>heap[2*i]) maxh=true;
// else minh=true;
// if(heap[i]>heap[2*i+1]) maxh=true;
// else minh=true;
// }
/*判断堆的正确写法*/
for(int i=1;i<=n;i++){
for(int j=0;j<2;j++){
if(2*i+j<=n){
int a=heap[i],b=heap[2*i+j];
if(a<b) minh=true;
else maxh=true;
}
}
}
if(minh&&maxh) puts("Not Heap");
else if(minh) puts("Min Heap");
else if(maxh) puts("Max Heap");
dfs(1);
puts("");
}
return 0;
}