艱難的英語單詞: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;
}