题意:

给一个二叉树的层次遍历,问是什么类型的堆,是大顶堆还是小顶堆,然后输出这个树的后续遍历

题解:

大小堆根直接比较a[i]与a[i/2]即可
因为给的树的层次遍历,i就是i/2儿子
后序遍历,对于节点index分别遍历孩子index2和右孩子index2+1,遍历完左右子树输出根节点
代码建议背诵

代码:

#include <iostream>
using namespace std;
int a[1005], m, n;
void postOrder(int index) {
    if (index > n) return;
    postOrder(index * 2);
    postOrder(index * 2 + 1);
    printf("%d%s", a[index], index == 1 ? "\n" : " ");
}
int main() {
    scanf("%d %d", &m, &n);
    while (m--) {
        int minn = 1, maxn = 1;
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        for (int i = 2; i <= n; i++) {
            if (a[i] > a[i / 2]) maxn = 0;
            if (a[i] < a[i / 2]) minn = 0;
        }
        if (maxn == 1) printf("Max Heap\n");
        else if (minn == 1) printf("Min Heap\n");
        else printf("Not Heap\n");
        postOrder(1);
    }
    return 0;
}