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]<heap[i])||(2*i+1<=N&&heap[2*i+1]<heap[i])){
            return false;
        }
    }
    return true;
}

提交結果:

image.png

AC代碼:

#include<cstdio>

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]<heap[i])||(2*i+1<=N&&heap[2*i+1]<heap[i])){
            return false;
        }
    }
    return true;
}

int num;// 控制空格輸出
void postTraverse(int root){
    if(root>N) return;
    postTraverse(2*root);
    postTraverse(2*root+1);
    printf("%d",heap[root]);
    if(num<N-1) printf(" ");
    ++num;
}

int main(){
    scanf("%d %d",&M,&N);
    for (int i = 0; i < M; ++i) {
        // M次查詢
        num = 0;// 每次都得賦值爲0
        for (int j = 1; j <= N; ++j) {
            scanf("%d",&heap[j]);
        }
        if(isMinHeap()){
            printf("Min Heap\n");
        } else if(isMaxHeap()){
            printf("Max Heap\n");
        } else {
            printf("Not Heap\n");
        }
        postTraverse(1);
        printf("\n");// 記得換行
    }
    return 0;
}
相關文章
相關標籤/搜索