二叉堆(3)SkewHeap
斜堆。
测试文件 main.cpp:
#include <iostream>
#include "SkewHeap.h"
using std::cout;
using std::endl;
int main()
{
SkewHeap<int> lh(SkewHeap<int>::HeapType::MINIMEM);
auto il = { ,,,,,,,,, };
for (auto& x : il) lh.push(x);
cout << "Element:\n\t";
lh.levelTraversal();
cout << endl << endl;
cout << "Pop: " << lh.top() << endl << endl;
lh.pop();
cout << "Element:\n\t";
lh.levelTraversal();
cout << endl;
;
}
头文件 "SkewHeap":
#pragma once
#ifndef __SKEWHEAP_H__
#define __SKEWHEAP_H__
#include "BinaryTreeOperations.h"
template<typename _Ty>
class SkewHeap
{
struct Node
{
_Ty key;
Node* left = nullptr;
Node* right = nullptr;
Node(const _Ty& _key) :key(_key) {}
};
public:
, MAXIMEM };
public:
SkewHeap() = default;
SkewHeap(HeapType _heapType) { heapType = _heapType; }
~SkewHeap() { BTO::clear(root); size_n = ; }
; }
void preorderTraversal() { BTO::preorderTraversal(root, drawData); }
void inorderTraversal() { BTO::inorderTraversal(root, drawData); }
void postorderTraversal() { BTO::postorderTraversal(root, drawData); }
void iterativePreorderTraversal() { BTO::iterativePreorderTraversal(root, drawData); }
void iterativeInorderTraversal() { BTO::iterativeInorderTraversal(root, drawData); }
void iterativePostorderTraversal() { BTO::iterativePostorderTraversal(root, drawData); }
void levelTraversal() { BTO::levelTraversal(root, drawData); }
size_t size() const { return size_n; }
void pop();
_Ty& top() const;
void push(const _Ty&);
void merge(SkewHeap<_Ty>&);
private:
static void drawData(const Node* _node) { std::cout << _node->key << " "; }
bool compare(const _Ty& _a, const _Ty& _b)
{
return (heapType == HeapType::MAXIMEM) ? (_a > _b) : (_a < _b);
}
Node* merge(Node*&, Node*&);
private:
Node* root = nullptr;
size_t size_n = ;
HeapType heapType = HeapType::MAXIMEM;
};
template<typename _Ty>
void SkewHeap<_Ty>::pop()
{
if (root == nullptr) throw std::exception("SkewHeap is empty!");
Node* leftT = root->left;
Node* rightT = root->right;
delete root;
root = merge(leftT, rightT);
--size_n;
}
template<typename _Ty>
_Ty& SkewHeap<_Ty>::top() const
{
if (root == nullptr) throw std::exception("SkewHeap is empty!");
return root->key;
}
template<typename _Ty>
void SkewHeap<_Ty>::push(const _Ty& _key)
{
Node* temp = new Node(_key);
root = merge(root, temp);
temp = nullptr;
++size_n;
}
template<typename _Ty>
void SkewHeap<_Ty>::merge(SkewHeap<_Ty>& _lh)
{
if (heapType != _lh.heapType) throw std::exception("Bad heapType");
root = merge(root, _lh.root);
_lh.root = nullptr;
size_n += _lh.size_n;
_lh.size_n = ;
}
template<typename _Ty>
typename SkewHeap<_Ty>::Node* SkewHeap<_Ty>::merge(Node*& _n1, Node*& _n2)
{
if (_n1 == nullptr && _n2 == nullptr) return nullptr;
else if (_n1 == nullptr) return _n2;
else if (_n2 == nullptr) return _n1;
if (!compare(_n1->key, _n2->key)) std::swap(_n1, _n2);
_n1->right = merge(_n1->right, _n2);
std::swap(_n1->left, _n1->right);
return _n1;
}
#endif // !__SKEWHEAP_H__
二叉堆(3)SkewHeap的更多相关文章
- AC日记——二叉堆练习3 codevs 3110
3110 二叉堆练习3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定N(N≤500,000)和N个整 ...
- codevs 3110 二叉堆练习3
3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...
- 数据结构图文解析之:二叉堆详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- 二叉堆(一)之 图文解析 和 C语言的实现
概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...
- 二叉堆(二)之 C++的实现
概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...
- 二叉堆(三)之 Java的实现
概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...
- 二叉堆(binary heap)
堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...
- 在A*寻路中使用二叉堆
接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序 这一篇文章,是&q ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
随机推荐
- css架构技巧
1. 写一个reset.css 用于清除浏览器标签默认样式并定义全局样式,这样就不会因为浏览器默认样式出现问题,因为不同浏览器的默认样式还是不一样的
- 动态规划------背包问题(c语言)
/*背包问题: 背包所能容纳重量为10:共五件商品,商品重量用数组m存储m[5]={2,2,6,5,4}, 每件商品的价值用数组n存储,n[5]={6,3,5,4,6};求背包所能装物品的最大价值. ...
- Spark之RDD本质
1.在一个完整的数据转换流程里往往涉及到多个具有衍生关系RDD,这些RDD其实是通过逻辑串联来利用装饰器模式层层包装扩展的的一堆对象,这些相邻RDD间必须有继承关系.并且比Java中的装饰器来的更彻底 ...
- 11种常用css样式之表格和定位样式学习
table表格中border-collapse: collapse;/*表格边框是否合并*/border-spacing: 10px;/*表格边框之间的距离*/定位详情可以阅读position属性值4 ...
- 2019-2020-2 20175121杨波《网络对抗技术》第一周kali的安装
2019-2020-2 20175121杨波<网络对抗技术>第一周kali的安装 标签 : Linux 一.下载安装kali 1.下载kali 下载链接 打开链接进入官网后,点击Torre ...
- Gartner评估:众包将掀起IT服务市场的革命
国际IT顾问与咨询公司Gartner发布评估报告,称众包是中国的一种新兴业务模式,将掀起IT服务市场的革命.然而,只有很少的的服务提供商会构建众包平台来尝试使用该业务模式.IT服务提供商的业务部门负责 ...
- Linux 防SSH暴力攻击
在下这几天发现我的VPS 总是莫名遭受到 江苏镇江那边的IP 登录请求攻击 ,跟踪了下路由,发现ip是从蒙古那边出去的,然后意识到可能是有扫描端口的.. 方法一: 现在的互联网非常不安全,很多人没事就 ...
- P2214 [USACO14MAR]哞哞哞Mooo Moo
链接:Miku ---------------------- 这道题还是个背包 --------------------- 首先看一下声音的组成,对于每一个农场的声音,它是由两部分组成的 :上一个农场 ...
- MongoDB批量操作时字段为null时没有入库
今天在Java后端批量插入数据至MongoDB后,在MongoDB数据库中发现某个字段没有成功入库,一查看代码,在List的元素对象中是有这个字段的,不知为啥就没有入库了. (1)调试 遇到此情况,赶 ...
- Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set…
php打印小票错误提示:Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activate ...