PAT(Advanced)甲級1155 Heap Paths C++實現
題目鏈接
題目大意
給定一組完全二叉樹的層次遍歷序列,輸出從根節點到葉子節點的所有序列,右子樹路徑打印在左子樹路徑前,並判斷給定的完全二叉樹是滿足堆性質,若爲最大堆輸出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
鳴謝
最後
- 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!