1155 Heap Paths (30 分)深搜回溯打印树的路径并判断堆的类型

mac2024-04-07  37

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 N (1<N≤1,000), the number of keys in the tree. Then the next line contains N 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

题意:先给出一个完全二叉树(其实结构满足堆)的结点个数,再给出各个结点的值,要打印出从根节点到叶子结点的每一条路径,并且这些路径是从右往左的,是先序的镜像序列,并且判断这个树是最大堆,最小堆,还是不是堆。 思路: 1.深搜打印路径:用vector保存每次深搜的结点的值,将根节点的索引从1开始,只要判断index * 2 > n 并且index * 2 + 1 > n,但为了防止是完全二叉树的最后一层,所以还要Index <= n满足后说明到达叶子结点,打印vector中所存储的所有结点的值。接下来在深搜过程中,先存入右节点的值,然后深搜,通过push_back,和pop_back来回溯,维护路径。但是要注意的是,在深搜前,要把根节点的值先放到路径中去。 2. 判断堆的类型:从第二层开始遍历,如果比父节点小,就不是小土堆,如果比父节点大,就不是大土堆。

#include<iostream> #include<cstdio> #include<stack> #include<queue> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<set> #include<map> #include<cctype> #include<cstdlib> #include<ctime> #include<unordered_map> using namespace std; vector<int> v;//存储路径 int a[1010];//存储树的结点的值 int n;//树的结点数目 int ismax = 1,ismin = 1; void dfs(int index) { if(index * 2 > n && index * 2 + 1 > n) { if(index <= n) { for(int i = 0;i < v.size();i++) { printf("%d%s",v[i],i != v.size() - 1 ? " " : "\n"); } } } else { v.push_back(a[index * 2 + 1]); dfs(index * 2 + 1); v.pop_back(); v.push_back(a[index * 2]); dfs(index * 2); v.pop_back(); } } int main() { scanf("%d",&n); for(int i = 1;i <= n;i++) { scanf("%d",&a[i]); } v.push_back(a[1]); dfs(1); for(int i = 2;i <= n;i++) { if(a[i / 2] > a[i]) { ismin = 0; } if(a[i / 2] < a[i]) { ismax = 0; } } if(ismin) { printf("Min Heap\n"); } else { if(ismax) { printf("Max Heap\n"); } else { printf("Not Heap\n"); } } return 0; }
最新回复(0)