PAT(Advanced)1155 Heap Paths C++實現

PAT(Advanced)甲級1155 Heap Paths C++實現

題目鏈接

1155 Heap Paths

題目大意

給定一組完全二叉樹的層次遍歷序列,輸出從根節點到葉子節點的所有序列,右子樹路徑打印在左子樹路徑前,並判斷給定的完全二叉樹是滿足堆性質,若爲最大堆輸出Max Heap,若爲最小堆則輸出Min Heap,若不是堆則輸出Not Heap

算法思路

根據題意,給定完全二叉樹的層次遍歷序列,利用二叉樹順序存儲結構,進行先序遍歷,設置vector<int>整型動態數組answer,以及vector<vector<int> >二維動態數組answers,遞歸地,對於每個節點將其存入answer中,若到達葉子節點,將answer加入answers,回溯繼續遍歷,先遍歷右子樹再遍歷左子樹,根據堆性質,求得的序列若遞增有序則爲最大堆,若遞減有序則爲最小堆,否則不是堆結構,根據該性質即可判斷給定的完全二叉樹是否爲堆結構

/*
author : eclipse
email  : [email protected]
time   : Sun Jun 28 17:25:19 2020
*/
#include <bits/stdc++.h>
using namespace std;

vector<int> binaryTree;
vector<vector<int> > answers;

void preOrderTraverse(int p, vector<int> answer) {
    if (p >= binaryTree.size()) {
        return;
    }
    int left = 2 * p;
    int right = 2 * p + 1;
    answer.push_back(binaryTree[p]);
    if (left >= binaryTree.size() && right >= binaryTree.size()) {
        answers.push_back(answer);
        return;
    }
    preOrderTraverse(right, answer);
    preOrderTraverse(left, answer);
}

bool maxHeap() {
    for (int i = 0; i < answers.size(); i++) {
        for (int j = 0; j < answers[i].size() - 1; j++) {
            if (answers[i][j] < answers[i][j + 1]) {
                return false;
            }
        }
    }
    return true;
}

bool minHeap() {
    for (int i = 0; i < answers.size(); i++) {
        for (int j = 0; j < answers[i].size() - 1; j++) {
            if (answers[i][j] > answers[i][j + 1]) {
                return false;
            }
        }
    }
    return true;
}

void print() {
    for (int i = 0; i < answers.size(); i++) {
        printf("%d", answers[i][0]);
        for (int j = 1; j < answers[i].size(); j++) {
            printf(" %d", answers[i][j]);
        }
        printf("\n");
    }
    if (maxHeap()) {
        printf("Max Heap");
    } else if (minHeap()) {
        printf("Min Heap");
    } else {
        printf("Not Heap");
    }
}

int main(int argc, char const *argv[]) {
    int N;
    scanf("%d", &N);
    binaryTree.resize(N + 1);
    for (int i = 1; i < binaryTree.size(); i++) {
        scanf("%d", &binaryTree[i]);
    }
    vector<int> answer;
    preOrderTraverse(1, answer);
    print();
    return 0;
}

樣例輸入1

8
98 72 86 60 65 12 23 50

樣例輸出1

98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap

樣例輸入2

8
8 38 25 58 52 82 70 60

樣例輸出2

8 25 70
8 25 82
8 38 52
8 38 58 60
Min Heap

樣例輸入2

8
10 28 15 12 34 9 8 56

樣例輸出2

10 15 8
10 15 9
10 28 34
10 28 12 56
Not Heap

鳴謝

PAT

最後

  • 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章