PAT(Advanced)1147 Heaps (C++实现)

PAT(Advanced)1147 Heaps (C++实现)

题目链接

1147 Heaps

题目大意

给定各不相同的非负整数层序遍历序列,判断该序列是否为堆结构,若是最大堆则输出Max Heap,若是最小堆则输出Min Heap,若不满足堆结构则输出Not Heap,下一行输出后序遍历序列

算法思路

根据堆的定义,左右子树的关键字小于根节点的二叉树为最大堆,反之则为最小堆,递归地判断当前子树是否满足堆性质、当前子树的左右子树是否满足堆性质,叶子节点直接返回true,递归结束后即可得到结果,先判断是否为最大堆,然后判断是否为最小堆,最后输出后序遍历序列

AC代码

/*
author : eclipse
email  : eclipsecs@qq.com
time   : Sun Jun 21 21:59:15 2020
*/
#include <bits/stdc++.h>
using namespace std;

class Heap {
private:
    vector<int> sequence;
    vector<int> postOrderSequence;
    bool isMaxHeap(int p);
    bool isMinHeap(int p);
    void postOrderTraverse(int p);
public:
    Heap() {};
    void isHeap(vector<int> v);
    void printPostOrder();
};

void Heap::isHeap(vector<int> v) {
    sequence.clear();
    sequence.push_back(0);
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        sequence.push_back(*it);
    }
    if (isMaxHeap(1)) {
        printf("Max Heap\n");
    } else if (isMinHeap(1)) {
        printf("Min Heap\n");
    } else {
        printf("Not Heap\n");
    }
}

bool Heap::isMaxHeap(int p) {
    if (p >= sequence.size()) {
        return true;
    }
    int left = 2 * p;
    int right = 2 * p + 1;
    if (left < sequence.size() && right < sequence.size()) {
        return sequence[p] > sequence[left] && sequence[p] > sequence[right] && isMaxHeap(left) && isMaxHeap(right);
    } else if (left < sequence.size()) {
        return sequence[p] > sequence[left] && isMaxHeap(left);
    } else if (right < sequence.size()) {
        return sequence[p] > sequence[right] && isMaxHeap(right);
    } else {
        return true;
    }
}

bool Heap::isMinHeap(int p) {
    if (p >= sequence.size()) {
        return true;
    }
    int left = 2 * p;
    int right = 2 * p + 1;
    if (left < sequence.size() && right < sequence.size()) {
        return sequence[p] < sequence[left] && sequence[p] < sequence[right] && isMinHeap(left) && isMinHeap(right);
    } else if (left < sequence.size()) {
        return sequence[p] < sequence[left] && isMinHeap(left);
    } else if (right < sequence.size()) {
        return sequence[p] < sequence[right] && isMinHeap(right);
    } else {
        return true;
    }
}

void Heap::printPostOrder() {
    postOrderSequence.clear();
    postOrderTraverse(1);
    vector<int>::iterator it = postOrderSequence.begin();
    printf("%d", *it);
    while (++it != postOrderSequence.end()) {
        printf(" %d", *it);
    }
    printf("\n");
}

void Heap::postOrderTraverse(int p) {
    if (p >= sequence.size()) {
        return;
    }
    int left = 2 * p;
    postOrderTraverse(left);
    int right = 2 * p + 1;
    postOrderTraverse(right);
    postOrderSequence.push_back(sequence[p]);
}

int main(int argc, char const *argv[]) {
    int M, N;
    Heap *heap = new Heap();
    scanf("%d%d", &M, &N);
    for (int i = 0; i < M; i++) {
        vector<int> v;
        for (int j = 0; j < N; j++) {
            int value;
            scanf("%d", &value);
            v.push_back(value);
        }
        heap->isHeap(v);
        heap->printPostOrder();
    }
    return 0;
}

样例输入

3 8
98 72 86 60 65 12 23 50
8 38 25 58 52 82 70 60
10 28 15 12 34 9 8 56

样例输出

Max Heap
50 60 65 72 12 23 86 98
Min Heap
60 58 52 38 82 70 25 8
Not Heap
56 12 34 28 9 8 15 10

鸣谢

PAT

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值