题目描述
链接
给一个树的层序遍历,判断它是不是堆,是大顶堆还是小顶堆。输出这个树的后序遍历
分析
- 堆实际是一棵完全二叉树,大顶堆满足,根节点大于左右子树的所有结点
- 堆有数组存储,遍历堆的方法:遍历所有有孩子的结点,一共有(0)到((n-1)/2)个。具体见代码!!注意不要越界!!
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int t,n,flag;
int a[maxn];
vector<int> ans;
void postorder(int root){
if(root >= n) return;
postorder(2*root+1);
postorder(2*root+2);
ans.push_back(a[root]);
}
int main(){
cin>>t>>n;
while(t--){
ans.clear();
flag = 0;
for(int i=0;i<n;i++) cin>>a[i];
if(a[0] > a[1]) flag = 1; else if(a[0] < a[1]) flag = -1;
for(int i=0;i<=(n-1)/2;i++){ //遍历堆!!
int l = 2*i+1, r =2*i+2; //取孩子结点
if(flag==1 && ( (a[i] < a[l]) || (r < n && a[i] < a[r]) ) ) flag = 0; //r<n避免越界
if(flag==-1 && ( (a[i] > a[l]) || (r < n && a[i] > a[r]) ) ) flag = 0;
}
postorder(0);
if(flag==0) printf("Not Heap
");
else if(flag == 1) printf("Max Heap
");
else printf("Min Heap
");
for(int i=0;i<n;i++){
if(i==0) printf("%d",ans[i]);
else printf(" %d",ans[i]);
}
printf("
");
}
}