PAT甲级——A1155 HeapPaths【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))
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), 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 8Solution:
10 15 9
10 28 34
10 28 12 56
Not Heap
这道题很简单,和前面的一道题类似
抓住两个重要条件:
一个是大根堆,小根堆的特点
一个是完全二叉树的性质
然后通过层序遍历序列重构二叉树
通过序列中第一个数与第二个数的大小比较就可以知道是大根堆还是小根堆【注意,一般不要相信题目中所谓的等于,因为PAT中的节点值就从来没有等于过】
通过判断节点与其孩子节点的值的大小可知是否满足Heap Tree的性质
最后使用DFS来输出路径,记得先右再左
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
struct Node
{
int val;
Node *l, *r;
Node(int a = ) :val(a), l(nullptr), r(nullptr) {}
};
int n;
vector<int>level;
Node *creatTree(int index)//重构二叉树
{
Node *root = new Node(level[index++]);
queue<Node*>q;
q.push(root);
while (!q.empty() && index<n)
{
Node *p = q.front();
q.pop();
p->l = new Node(level[index++]);
q.push(p->l);
if (index >= n)break;
p->r = new Node(level[index++]);
q.push(p->r);
}
return root;
}
vector<int>res;
void DFS(Node *root, bool isMaxHeap,bool &isHeap)
{
if (root == nullptr)
return;
res.push_back(root->val);
if (isMaxHeap)//大根堆判断
{
if ((root->l && root->l->val > root->val) || (root->r && root->r->val > root->val))
isHeap = false;
}
else//小根堆判断
{
if ((root->l && root->l->val < root->val) || (root->r && root->r->val < root->val))
isHeap = false;
}
if (root->l == nullptr && root->r == nullptr)//输出路径
{
for (int i = ; i < res.size(); ++i)
cout << (i == ? "" : " ") << res[i];
cout << endl;
}
DFS(root->r, isMaxHeap, isHeap);//记得先右再左
DFS(root->l, isMaxHeap, isHeap);
res.pop_back();
}
int main()
{
cin >> n;
level.resize(n);
for (int i = ; i < n; ++i)
cin >> level[i];
Node* root = creatTree();
bool isHeap = true;
bool isMaxHeap = level[] >= level[] ? : ;
DFS(root, isMaxHeap, isHeap);
if (isHeap && isMaxHeap)
cout << "Max Heap" << endl;
else if (isHeap && !isMaxHeap)
cout << "Min Heap" << endl;
else
cout << "Not Heap" << endl;
return ;
}
原谅孩子不会静态重构二叉树吧 :), 静态重构【就是根据序列数位置得到整个数树的形状】是我的硬伤,相信不久的明天我就学会了 ^_^
这里借用一下别人静态重构的代码吧
#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
int a[], n, isMin = , isMax = ;
void dfs(int index) {
if (index * > n && index * + > n) {
if (index <= n) {
for (int i = ; i < v.size(); i++)
printf("%d%s", v[i], i != v.size() - ? " " : "\n");
}
}
else {
v.push_back(a[index * + ]);
dfs(index * + );
v.pop_back();
v.push_back(a[index * ]);
dfs(index * );
v.pop_back();
}
}
int main() {
cin >> n;
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
v.push_back(a[]);
dfs();
for (int i = ; i <= n; i++) {
if (a[i / ] > a[i]) isMin = ;
if (a[i / ] < a[i]) isMax = ;
}
if (isMin == )
printf("Min Heap");
else
printf("%s", isMax == ? "Max Heap" : "Not Heap");
return ;
}
PAT甲级——A1155 HeapPaths【30】的更多相关文章
- PAT 甲级 1147 Heaps (30 分) (层序遍历,如何建树,后序输出,还有更简单的方法~)
1147 Heaps (30 分) In computer science, a heap is a specialized tree-based data structure that sati ...
- PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****
1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the prin ...
- pat 甲级 1057 Stack(30) (树状数组+二分)
1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the princi ...
- PAT甲级:1064 Complete Binary Search Tree (30分)
PAT甲级:1064 Complete Binary Search Tree (30分) 题干 A Binary Search Tree (BST) is recursively defined as ...
- PAT甲级题解(慢慢刷中)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT甲级1127. ZigZagging on a Tree
PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...
- PAT甲级1119. Pre- and Post-order Traversals
PAT甲级1119. Pre- and Post-order Traversals 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二进制树可以通过给定的一对后序和顺序遍历序列来确定,也可以通 ...
- PAT甲级1057. Stack
PAT甲级1057. Stack 题意: 堆栈是最基础的数据结构之一,它基于"先进先出"(LIFO)的原理.基本操作包括Push(将元素插入顶部位置)和Pop(删除顶部元素).现在 ...
- PAT甲级1026. Table Tennis
PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...
随机推荐
- Oracle 汉字占用字节数
在oracle中一个字符特别是中文字符占几个字节是与字符集有关的. 比如GBK,汉字就会占两个字节,英文1个:如果是UTF-8,汉字一般占3个字节,英文还是1个.但是一般情况下,我们都认为是 ...
- 使用网易云web 版外部链接
右击打开控制台,找到音乐列表 ——> 点开详情 -------> 生成外部链接器 ,如: outchain/0/3073492173 ,这是每一个音乐的编号. 然后拼接上它的官网域名 ...
- 图标,空格,大小尖括号,段落,换行,标题,div白板,span白板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- psfstriptable - 从控制台字体中移走嵌入的Uniocde字符表
总览 psfstriptable 字体文件 [输出文件] 描述 psfstriptable 命令从 字体文件 或者标准输入(此时的 字体文件 是单个破折号(-))读取一个可能含有嵌入Unicode字体 ...
- psfgettable - 从控制台字体中提取出嵌入的Unicode字符表
总览 psfgettable 字体文件 [输出文件] 描述 psfgettable 命令从一个 .psf 格式的控制台字体中提取出嵌入的 Unicode字符表, 以易读格式输入到一个ASCII文件, ...
- Go 迭代切片
迭代切片有两种方式: 1. 使用 for range 迭代切片 // 其长度和容量都是 4 个元素 slice := [], , , } // 迭代每一个元素,并显示其值 for index, v ...
- php 从7.0升级到7.2
下面的方法安装的php是非线程安全的,apache2服务器用不了 1. 添加Ondřej Surý提供的PHP源: sudo apt-get install software-properties-c ...
- Es学习第十课,ElasticSearch集群搭建
前面几课我们已经把ES的基本概念和查询了解了,大家知道ES的核心优势就是天生支持分布式,所以,这课我们专门讲讲怎么搭建实现ES的集群部署. ES分布式原理 1.es分布式概念 主分片(Primary ...
- cookie和session的区别有哪些
前言: cookie和session有着千丝万缕的联系,本文将详细介绍2者的区别. 1.存储位置不同 cookie的数据信息存放在客户端浏览器上. session的数据信息存放在服务器上. 2.存储容 ...
- vue中使用canvas绘制签名
不多说,上代码: <template> <div class="sign-canvas"> <canvas ...