PAT甲级2018春季7-4 1147 Heaps (30分)

清疚 2023-02-24 08:54 140阅读 0赞

算法笔记总目录
关键英语单词解释
1147 Heaps (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))

Your job is to tell if a given complete binary tree is a heap.

Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers: M (≤ 100), the number of trees to be tested; and N (1 < N ≤ 1,000), the number of keys in each tree, respectively. Then M lines follow, each 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, 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. Then in the next line print the tree’s postorder traversal sequence. All the numbers are separated by a space, and there must no extra space at the beginning or the end of the line.

Sample Input:

  1. 3 8
  2. 98 72 86 60 65 12 23 50
  3. 8 38 25 58 52 82 70 60
  4. 10 28 15 12 34 9 8 56

Sample Output:

  1. Max Heap
  2. 50 60 65 72 12 23 86 98
  3. Min Heap
  4. 60 58 52 38 82 70 25 8
  5. Not Heap
  6. 56 12 34 28 9 8 15 10

题意:
给出一个完全二叉树,判断是不是堆,是什么堆,输出其后序遍历
思路:
根据完全二叉树的性质 父x 左x2 右x2+1 建树,判断堆,直接利用层序数组里 level[i] 大于还是小于 level[2i] 与 level[2i+1],在后序遍历

相似题及思路可参考A1155

代码一(不建树)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,level[1010],x=0;
  4. vector<int> v;
  5. void dfs(int index){
  6. if (index > n ) return;
  7. v.push_back(level[index]);
  8. dfs(index * 2 + 1);
  9. dfs(index * 2);
  10. }
  11. int main(){
  12. scanf("%d %d",&x,&n);
  13. for(int j=0;j<x;j++){
  14. int isMin = 1, isMax = 1;
  15. v.clear();
  16. for (int i = 1; i <= n; i++) scanf("%d", &level[i]);
  17. dfs(1);
  18. for (int i = 2; i <= n; i++) {
  19. if (level[i/2] > level[i]) isMin = 0;
  20. if (level[i/2] < level[i]) isMax = 0;
  21. }
  22. if (isMin == 1) printf("Min Heap");
  23. else printf("%s", isMax == 1 ? "Max Heap" : "Not Heap");
  24. printf("\n");
  25. printf("%d",v[v.size()-1]);
  26. for(int i=v.size()-2;i>=0;i--)printf(" %d",v[i]);
  27. if(j<x-1)printf("\n");
  28. }
  29. return 0;
  30. }

在这里插入图片描述

代码二(建树)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int val;
  5. node *lchild,*rchild;
  6. };
  7. int n,level[1010],x=0,flag=0;
  8. node *create(int x,node *root)//1号位开始
  9. {
  10. if(x>n) return NULL;
  11. root->val=level[x];
  12. root->lchild=create(x*2,new node);
  13. root->rchild=create(x*2+1,new node);
  14. return root;
  15. }
  16. void printTree(node *root){
  17. if(root == NULL) return;
  18. printTree(root->lchild);
  19. printTree(root->rchild);
  20. if(flag==1)printf(" %d",root->val);
  21. else printf("%d",root->val);
  22. flag=1;
  23. }
  24. int main(){
  25. scanf("%d %d",&x,&n);
  26. for(int j=0;j<x;j++){
  27. int isMin = 1, isMax = 1;
  28. flag=0;
  29. node *root = new node;
  30. for (int i = 1; i <= n; i++) scanf("%d", &level[i]);
  31. for (int i = 2; i <= n; i++) {
  32. if (level[i/2] > level[i]) isMin = 0;
  33. if (level[i/2] < level[i]) isMax = 0;
  34. }
  35. if (isMin == 1) printf("Min Heap");
  36. else printf("%s", isMax == 1 ? "Max Heap" : "Not Heap");
  37. printf("\n");
  38. printTree(create(1,root));
  39. if(j<x-1)printf("\n");
  40. }
  41. return 0;
  42. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读