版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hide_in_Code/article/details/82141569
艰难的英语单词:postorder traversal 后序遍历
题意:给一个完全二叉树,判断是最大堆还是最小堆还是都不是。
难点:完全二叉树用数组存的时候(个人习惯下标从1开始),左孩子节点是父亲节点*2,右孩子是父亲节点*2+1。对于一个玩完全二叉树来说,N个节点,那么有N/2个叶子!
知道上面知识点以后,本题就很简单,从节点1到N/2,判断是否都符合最大堆或者最小堆特性,否则就什么都不是。
Code:
#include<bits/stdc++.h>
using namespace std;
#define inf 1009
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)
int n,m;
int e[inf];
bool tag;//第一个输出标记
bool isMaxHeap()
{
int i;
loop(i,1,n/2+1)
{
if(e[i]<e[i*2])return false;
if(i*2+1<=n&&e[i]<e[i*2+1])return false;
}
return true;
}
bool isMinHeap()
{
int i;
loop(i,1,n/2+1)
{
if(e[i]>e[i*2])return false;
if(i*2+1<=n&&e[i]>e[i*2+1])return false;
}
return true;
}
void postOrder(int v)
{
if(v*2<=n)postOrder(v*2);
if(v*2+1<=n)postOrder(v*2+1);
if(tag)
{
printf("%d",e[v]);
tag=false;
}
else
printf(" %d",e[v]);
}
void Input()
{
scanf("%d%d",&m,&n);
while(m--)
{
int i;
tag=true;
loop(i,1,n+1)
scanf("%d",&e[i]);
if(isMaxHeap())
printf("Max Heap\n");
else if(isMinHeap())
printf("Min Heap\n");
else
printf("Not Heap\n");
postOrder(1);
printf("\n");
}
}
int main()
{
Input();
return 0;
}