PAT_甲级_1147 Heaps

题目大意:

现有M个查询,每一个查询给定一个长度为N的完全二叉树层序序列,判断该二叉树是大根堆,小根堆和非堆,然后输出该完全二叉树的后序遍历序列。

算法思路:

对于完全二叉树可以使用一个数组来保存其层序序列,然后使用函数isMaxHeap和isMinHeap分别判断该完全二叉树是否是大根堆还是小根堆,如果都不是则输出Not Heap,然后再使用postTraverse对该完全二叉树进行后序遍历,访问节点的时候输出节点即可。

isMaxHeap
// 判断是否是大根堆
bool isMaxHeap(){
    for (int i = 1; i <= N; ++i) {
        if((2*i<=N&&heap[2*i]>heap[i])||(2*i+1<=N&&heap[2*i+1]>heap[i])){
            return false;
        }
    }
    return true;
}
isMinHeap
// 判断是否是小根堆
bool isMinHeap(){
    for (int i = 1; i <= N; ++i) {
        if((2*i<=N&&heap[2*i]

提交结果:

image.png

AC代码:

#include

using namespace std;

int heap[1005];
int M,N;

// 判断是否是大根堆
bool isMaxHeap(){
    for (int i = 1; i <= N; ++i) {
        if((2*i<=N&&heap[2*i]>heap[i])||(2*i+1<=N&&heap[2*i+1]>heap[i])){
            return false;
        }
    }
    return true;
}

// 判断是否是小根堆
bool isMinHeap(){
    for (int i = 1; i <= N; ++i) {
        if((2*i<=N&&heap[2*i]N) return;
    postTraverse(2*root);
    postTraverse(2*root+1);
    printf("%d",heap[root]);
    if(num

你可能感兴趣的:(算法-数据结构,c++,堆)