思路:
- 根据层次遍历建树。
- 从根节点做一次dfs,记录每个节点的父节点。
- 依次检查每一个元素是否合法即可,即但凡有一个元素大于父亲元素就不是Max Heap,但凡有一个元素小于父亲元素就不是Min Heap。
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef struct Tnode *p;
const int N=1e4+5;
struct Tnode{
p ls,rs;
int data;
};
int q,n,idx,postorder[N];
map<int,int>fa;
p newTnode(int x){
p root=new Tnode;
root->data=x;
root->ls=root->rs=NULL;
return root;
}
void Postorder(p p){
if(p){
Postorder(p->ls);
Postorder(p->rs);
postorder[idx++]=p->data;
}
else return;
}
bool cmp(int a,int b){return a>b;}
void dfs(p u,int father){
fa[u->data]=father;
if(u->ls) dfs(u->ls,u->data);
if(u->rs) dfs(u->rs,u->data);
}
int main(){
scanf("%d%d",&q,&n);
while(q--){
p root=NULL;
queue<p>q;
idx=0;
vector<int>v;
fa.clear();
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
v.push_back(x);
if(i==0){
root=newTnode(x);
q.push(root);
continue;
}
while(!q.empty()){
p t=q.front();
p tmp=newTnode(x);
if(t->ls==NULL) t->ls=tmp;
else if(t->rs==NULL) t->rs=tmp;
else{
q.pop();
continue;
}
q.push(tmp);
break;
}
}
Postorder(root);
dfs(root,0);
bool flag1=true,flag2=true;
for(int i=0;i<n;i++){
if(i==0) continue;
int father=fa[v[i]];
if(v[i]>father) flag1=false;
}
for(int i=0;i<n;i++){
if(i==0) continue;
int father=fa[v[i]];
if(v[i]<father) flag2=false;
}
if(flag1&&!flag2) puts("Max Heap");
else if(!flag1&&flag2) puts("Min Heap");
else puts("Not Heap");
for(int i=0;i<n;i++){
if(i==0) printf("%d",postorder[i]);
else printf(" %d",postorder[i]);
}
puts("");
}
return 0;
}