PAT 甲级 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 分) (层序遍历,如何建树,后序输出,还有更简单的方法~)的更多相关文章
- PAT Advanced 1147 Heaps (30) [堆,树的遍历]
题目 In computer science, a heap is a specialized tree-based data structure that satisfies the heap pr ...
- PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****
1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the prin ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
- 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 ...
- PAT甲级——1147 Heaps【30】
In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...
- 【PAT甲级】1119 Pre- and Post-order Traversals (30分)(已知先序后序输出是否二叉树唯一并输出中序遍历)
题意: 输入一个正整数N(<=30),接着输入两行N个正整数第一行为先序遍历,第二行为后续遍历.输出是否可以构造一棵唯一的二叉树并输出其中一颗二叉树的中序遍历. trick: 输出完毕中序遍历后 ...
- PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集
L2-006 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...
- 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 ...
- 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 ...
随机推荐
- java设计模式解析(1) Observer观察者模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...
- Java方法注意事项
使用方法的注意事项: 1.方法应该定义在类中,方法中不能再定义方法,也就是不能嵌套定义,但方法可以中可以调用方法 2.方法定义的前后顺序无所谓,执行的先后顺序只与调用有关 3.方法定义之后不会执行,如 ...
- 第二章--MYSQL体系结构和管理
体系结构 MySQL C/S模型 Server : mysqld Client : socket:仅本地连接使用 tcp/ip:应用连接使用(远程和本地) #TCP/IP方式(远程.本地) mysql ...
- IP地址与Mac地址绑定错误
有个application,有时候可以正常访问,有时候又返回404错误,百思不得其解.刚开始以为是文件夹权限问题,折腾了好久. 后来没在服务器上monitor到包,所以猜想是到了错误的mac地址,用a ...
- Spring入门(四)——整合Mybatis
1. 准备jar包及目录结构 2. 配置db.properties driver = com.mysql.jdbc.Driver url = jdbc:mysql://127.0.0.1:3306/H ...
- HTML5类操作
一.获取DOM的方式 ①通过类名获取元素,以伪数组形式存在 document.getElementsByClassName("class"); ②通过css选择器获取元素,符合匹配 ...
- 题解 UVA11105 【H-半素数 Semi-prime H-numbers】
做这道题之前首先要掌握的是线性筛的模板 附上题目链接 https://www.luogu.org/problem/P3383 首先这道题目的范围有些特殊必须是% 4 == 1的数才行 所以可以这样 直 ...
- LibreOJ #526. 「LibreOJ β Round #4」子集
二次联通门 : LibreOJ #526. 「LibreOJ β Round #4」子集 /* LibreOJ #526. 「LibreOJ β Round #4」子集 考虑一下,若两个数奇偶性相同 ...
- Processing 字体变形
在Processing中做字体变形通常需要有以下基础知识: 1.PGraphics对象 2.图片像素化 制作过程也不复杂,代码如下: color ELLIPSE_COLOR = color(0); c ...
- Oracle自动备份(多个库),压缩打包,删除原文件
1.创建一个database_Backup.bat文件,用记事本打开 内容参考如下:(楼主这里自动备份了四个数据库) set "now=%date:~0,4%%date:~5,2%%date ...