1155 Heap Paths (30 分)
In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if P is a parent node of C, then the key (the value) of P is either greater than or equal to (in a max heap) or less than or equal to (in a min heap) the key of C. A common implementation of a heap is the binary heap, in which the tree is a complete binary tree. (Quoted from Wikipedia at https://en.wikipedia.org/wiki/Heap_(data_structure))
One thing for sure is that all the keys along any path from the root to a leaf in a max/min heap must be in non-increasing/non-decreasing order.
Your job is to check every path in a given complete binary tree, in order to tell if it is a heap or not.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer (), the number of keys in the tree. Then the next line contains distinct integer keys (all in the range of int), which gives the level order traversal sequence of a complete binary tree.
Output Specification:
For each given tree, first print all the paths from the root to the leaves. Each path occupies a line, with all the numbers separated by a space, and no extra space at the beginning or the end of the line. The paths must be printed in the following order: for each node in the tree, all the paths in its right subtree must be printed before those in its left subtree.
Finally print in a line Max Heap
if it is a max heap, or Min Heap
for a min heap, or Not Heap
if it is not a heap at all.
Sample Input 1:
8
98 72 86 60 65 12 23 50
Sample Output 1:
98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap
Sample Input 2:
8
8 38 25 58 52 82 70 60
Sample Output 2:
8 25 70
8 25 82
8 38 52
8 38 58 60
Min Heap
Sample Input 3:
8
10 28 15 12 34 9 8 56
Sample Output 3:
10 15 8
10 15 9
10 28 34
10 28 12 56
Not Heap
题目解读:给出一个完全二叉树的层序遍历序列,从根遍历输出它的路径,右子树必须在左子树之前被输出,最后输出这个树是否是最大堆或最小堆。
解题思路: 由于是完全二叉树,所以可以用数组来存储heap,遍历只需要用dfs就可以了,因为数组存储heap方便计算,root应该是1而不是0。有一个小坑是要先输出右子树再输出左子树,更改一下遍历的顺序就行了。此外就是判断是否是最大堆最小堆,这里只需要检测不是的情况就可以了。AC之前错了一个判断条件是遍历完1~N的数组,i应该最后取得到N,直到N+1退出循环。
AC代码
#include <iostream>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int heap[1005];
int n;
void dfs(int v) {
if (2 * v > n) {
vector<int> num;
for (int i = v; i >= 1; i = i / 2) {
num.push_back(heap[i]);
}
for (int i = num.size()-1; i >= 0; i--) {
printf("%d%c", num[i],i == 0 ? '\n':' ');
}
return;
}
if (2 * v + 1 <= n) {
dfs(2 * v + 1);
}
if (2 * v <= n) {
dfs(2 * v);
}
}
int main(int argc, char** argv) {
int isMAX = 1;
int isMIN = 1;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &heap[i]);
}
dfs(1);
for (int i = 2; i <= n; i++) {
if (heap[i / 2] > heap[i]) isMIN = 0;
if (heap[i / 2] < heap[i]) isMAX = 0;
}
if (isMAX) {
printf("Max Heap\n");
}
if (isMIN) {
printf("Min Heap\n");
}
else if (!isMIN && !isMAX) {
printf("Not Heap\n");
}
return 0;
}
0 条评论