爆刷PAT(甲級)——之【1147】 Heaps(30 分)——堆的判別

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章