题意大概就是给定一棵二叉树判断它是不是大顶堆或者小顶堆,然后后序遍历输出一下。
直接递归先判断是不是大顶堆,然后判断是不是小顶堆,都不是输出Not Heap,最后接一个后续遍历。直接贴代码
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int n,m;
int flagd=1,flagx=1;
int qddd(int root){
int maxl=-9999999,maxr=-9999999;
if( (root << 1) <= m) maxl = qddd(root << 1);
if( (root << 1 | 1) <= m) maxr = qddd(root <<1 | 1);
int temp=max(maxl,maxr);
if(a[root]<temp) flagd = 0;
return max(a[root],temp);
}
int qxdd(int root){
int maxl=9999999,maxr=9999999;
if( (root << 1) <= m) maxl = qxdd(root << 1);
if( (root << 1 | 1) <= m) maxr = qxdd(root <<1 | 1);
int temp=min(maxl,maxr);
if(a[root]>temp) flagx = 0;
return min(a[root],temp);
}
int end_search(int root){
if((root << 1) <= m) end_search(root<<1);
if((root << 1 | 1) <= m) end_search(root<<1|1);
cout<<a[root];
if(root != 1) cout<<" ";
else cout<<endl;
}
int main()
{
cin>>n>>m;
while(n--)
{
for(int i=1;i<=m;i++)
cin>>a[i];
flagd=flagx=1;
qddd(1);
qxdd(1);
if(flagd) cout<<"Max Heap"<<endl;
if(flagx) cout<<"Min Heap"<<endl;
if(!flagd && !flagx) cout<<"Not Heap"<<endl;
end_search(1);
}
}