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. service worker(二)之主页面与service worker通信

    实现一个主页面发送消息,worker搜到信息向所有的页面派发消息(当前页面除外) msg.html <!DOCTYPE html> <html lang="en" ...

  2. to_excel

    Signature: df.to_excel( ['excel_writer', "sheet_name='Sheet1'", "na_rep=''", 'fl ...

  3. python - alipay sdk 使用 及 注意点

    一. 在 点击跳转 这里拿到自己的 appid  和  支付宝公钥 ,    如果想要得到 支付宝的公钥 就需要获取 应用的公钥,具体获取方式 : 获取应用公钥和私钥 a. 应用私钥和支付宝公钥 获取 ...

  4. LightOJ - 1349 - Aladdin and the Optimal Invitation

    链接: https://vjudge.net/problem/LightOJ-1349 题意: Finally Aladdin reached home, with the great magical ...

  5. JS发送验证码;并设置cookie

    Tool.send_code = function(obj) { var isCheck = true, form = $('#editInfo_Form'); var mobile = form.f ...

  6. 一个 Object.assign 的误解

    mozilla中对 Object.assign 的解释如下地址: mozilla 其中有说到 注意, Object.assign 会跳过那些值为 null 或 undefined 的源对象. 一直以为 ...

  7. C++2.0新特性(四)——<decltype、lambda>

    一.关键字decltype 引入新关键字decltype可以让编译器找出表达式的类型,为了区别typeof,以下做一个概念区分: typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型 ...

  8. 从过狗到编写tamper【转载】

    原作者:我会啊D 原文出处:https://www.t00ls.net/articles-52894.html 0x0 前言 在sql注入的时候,很可能会碰到各种厂商的waf,bypass之后,以后每 ...

  9. ubuntu之路——day11.3 不匹配数据划分的偏差和方差

    在11.2中,我们提到了一种数据划分的方法,那么怎么衡量这种数据划分方法中的误差呢? 来看一个例子:有20w条各种领域的语音识别数据,2w条汽车语音定位数据 train+dev+test,其中trai ...

  10. 覆盖elementui样式

    前台以表格形式展示后台数据,图片或视频点击后弹出框播放,用el-dialog实现. 希望播放视频的时候不显示dialog的背景那些. 尝试 scoped 无果 <style lang=" ...