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:

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

Sample Output:

Max Heap
50 60 65 72 12 23 86 98
Min Heap
60 58 52 38 82 70 25 8
Not Heap
56 12 34 28 9 8 15 10

题意:

给一个树的层序遍历,判断它是不是堆,是大顶堆还是小顶堆。输出这个树的后序遍历~

题解:

在输入程序遍历的时候就借用队列建树,同时判断堆的类型,建好树以后递归进行后序遍历输出。

方法暴力过于繁琐,下面有别人家的代码。。。

本题思路虽然容易想,但是建树不太熟练,建树通常有两种方法:数组建树 和 链表建树,参见:建树的两种方法

AC代码:

#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int m,n;
struct node{
int v;
node *l,*r;
};
queue<node*>q;
int sum=;
node* newnode(int x){//新建一个节点
node* newnode = new node;
newnode->v=x;
newnode->l=newnode->r=NULL;
return newnode;
}
void postorder(node *&root){//后序遍历
if(root->l) postorder(root->l);
if(root->r) postorder(root->r);
sum++;//用于计算是否要加空格
cout<<root->v;
if(sum!=n) cout<<" ";
else cout<<endl;
}
int main(){
cin>>m>>n;
int x;
node *root;
for(int i=;i<=m;i++){
int f=;//从小到大为1
while(!q.empty()) q.pop();
for(int j=;j<=n;j++){
cin>>x;
if(j==){
root= newnode(x);
q.push(root);
continue;
}
while(!q.empty()){//层序遍历用队列更方便
node* a = q.front();
node* b = newnode(x);
if(a->l==NULL){
a->l=b;
}else if(a->r==NULL){
a->r=b;
}else{
q.pop();//如果队头的节点的左右节点装满了就把它扔了再从队头拿出
continue;
}
q.push(b);
if(f== && a->v<x){//判读树的类型
f=;//从小到大为1
}else if(f== && a->v>x){
f=;//从大到小为2
}else if(f== && a->v>x){
f=-;//不符合条件为-1
}else if(f== && a->v<x){
f=-;
}
break;//记得要跳出
}
}
sum=;
if(f==){
cout<<"Min Heap"<<endl;
}else if(f==){
cout<<"Max Heap"<<endl;
}else cout<<"Not Heap"<<endl;
postorder(root);
}
return ;
}

更简单的不用建树的方法:

柳诺大神的做法

首先根据v[0]和v[1]的大小比较判断可能是大顶还是小顶,分别赋值flag为1和-1,先根据层序遍历,从0到n/2-1【所有有孩子的结点】判断他们的孩子是不是满足flag的要求,如果有一个结点不满足,那就将flag=0表示这不是一个堆。根据flag输出是否是堆,大顶堆还是小顶堆,然后后序遍历,根据index分别遍历index*2+1和index*2+2,即他们的左右孩子,遍历完左右子树后输出根结点,即完成了后序遍历~

#include <iostream>
#include <vector>
using namespace std;
int m, n;
vector<int> v;
void postOrder(int index) {
if (index >= n) return;
postOrder(index * + );
postOrder(index * + );
printf("%d%s", v[index], index == ? "\n" : " ");
}
int main() {
scanf("%d%d", &m, &n);
v.resize(n);
for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) scanf("%d", &v[j]);
int flag = v[] > v[] ? : -;
for (int j = ; j < n / ; j++) {
int left = j * + , right = j * + ;
if (flag == && (v[j] < v[left] || (right < n && v[j] < v[right]))) flag = ;
if (flag == - && (v[j] > v[left] || (right < n && v[j] > v[right]))) flag = ;
}
if (flag == ) printf("Not Heap\n");
else printf("%s Heap\n", flag == ? "Max" : "Min");
postOrder();
}
return ;
}

PAT 甲级 1147 Heaps (30 分) (层序遍历,如何建树,后序输出,还有更简单的方法~)的更多相关文章

  1. PAT Advanced 1147 Heaps (30) [堆,树的遍历]

    题目 In computer science, a heap is a specialized tree-based data structure that satisfies the heap pr ...

  2. PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****

    1057 Stack (30 分)   Stack is one of the most fundamental data structures, which is based on the prin ...

  3. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

  4. PAT Advance 1119 Pre- and Post-order Traversals (30) [树的遍历,前序后序转中序]

    题目 Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree c ...

  5. PAT甲级——1147 Heaps【30】

    In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...

  6. 【PAT甲级】1119 Pre- and Post-order Traversals (30分)(已知先序后序输出是否二叉树唯一并输出中序遍历)

    题意: 输入一个正整数N(<=30),接着输入两行N个正整数第一行为先序遍历,第二行为后续遍历.输出是否可以构造一棵唯一的二叉树并输出其中一颗二叉树的中序遍历. trick: 输出完毕中序遍历后 ...

  7. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集

    L2-006 树的遍历(25 分)   给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...

  8. PAT A1127 ZigZagging on a Tree (30 分)——二叉树,建树,层序遍历

    Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...

  9. PAT-2019年冬季考试-甲级 7-4 Cartesian Tree (30分)(最小堆的中序遍历求层序遍历,递归建树bfs层序)

    7-4 Cartesian Tree (30分)   A Cartesian tree is a binary tree constructed from a sequence of distinct ...

随机推荐

  1. HDFS中DataNode的心跳机制

    DataNode心跳机制的作用讲解了DataNode的三个作用: register:当DataNode启动的时候,DataNode需要将自身的一些信息(hostname, version等)告诉Nam ...

  2. Eclipse的tab键为4个空格完整方法 附:阿里代码开发规范书

    开发规范书:http://pan.baidu.com/s/1dESdyox 1.点击 window->preference-,依次选择 General->Editors->Text ...

  3. SpringMVC的拦截器和数据校验

    SpringMVC拦截器 什么是拦截器:Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以 ...

  4. PostgreSQL 索引坏块处理

    今天应用反应有张表查询报错,报错信息如下 back=# select max(create_time) from public.tbl_index_table where create_time> ...

  5. GDB的安装

    1.下载GDB7.10.1安装包 #wget http://ftp.gnu.org/gnu/gdb/gdb-7.10.1.tar.gz或者可以远程看下有哪些版本 http://ftp.gnu.org/ ...

  6. Java 冒泡排序算法

    public class StringSampleDemo { public static void main(String[] args) { int[] arr = {1, 2, -20, 20, ...

  7. vue的ref试用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. 【caffe I/O】数据读取层 代码中文注释

    caffe.proto中DataParameter部分 message DataParameter { //输入数据使用的DB类型 enum DB { LEVELDB = ;//使用LEVELDB L ...

  9. docker运行puppeteer出现defucnt僵尸进程

    其实这是docker的一个bug,就是在运行前加--init即可,注意这个在mac中没有只在linux上有. docker run --init -d ..... 具体内容参见:https://sta ...

  10. springcloud config自动刷新中文乱码问题

    摘录一段网上盛传的,如下: 在使用 spring cloud config 时,如果在 properties 文件里面有中文的话,会出现乱码. 乱码的原因是:spring 默认使用org.spring ...