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 : eclipsecs@qq.com
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
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!