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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/Hide_in_Code/article/details/82141569