题意:给出一个数组,求出以他构成的完全二叉树的所有路径,并判断其为大根堆还是小根堆,或者不是堆
#include<cstdio>
#include<vector>
using namespace std;
int n;
int a[1005];
vector<int> path;
int ifmin=1,ifmax=1;
void printpath()
{
for(int i=0;i<path.size();i++){
if(i!=0) printf(" ");
printf("%d",a[path[i]]);
}
printf("\n");
}
void dfs(int index)
{
if(2*index>n){
printpath();
return;
}
for(int i=1;i>=0;i--)
{
if(2*index+i<=n)
{
path.push_back(2*index+i);
int m=path.size();
if(a[path[m-1]]>a[path[m-2]]) ifmax=0;
else if(a[path[m-1]]<a[path[m-2]])ifmin=0;
dfs(2*index+i);
path.pop_back();
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
path.push_back(1);
dfs(1);
if(ifmax) printf("Max Heap");
if(ifmin) printf("Min Heap");
if(!ifmax&&!ifmin) printf("Not Heap");
}
看到网上有人dfs与判断大小堆分开来,感觉也很方便
for (int i = 2; i <= n; i++) {
if (a[i/2] > a[i]) ifMin = 0;
if (a[i/2] < a[i]) ifMax = 0;
}