二叉堆(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 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
随机推荐
- zabbix-mysql迁移分离
io过高,迁移mysql 停掉zabbix 导出数据库的zabbix库 导入到新机器,并启动mysql 1:修改zabbix_server.conf文件里DB相关的地址,用户名和密码. vim /et ...
- 再次小结windows服务的编写
2013-03-23 21:05 (分类:计算机程序) 其实很简单 void mian() { //服务的分派表 SERVICE_TABLE_ENTRY DispatchTable[] ={ ...
- ssh_key认证
ssh认证流程步骤: 1.主机host_key认证 2.身份验证 3.身份验证通过 原理及更多知识点,请查看好友博客 http://www.cnblogs.com/f-ck-need-u/p/7129 ...
- C# 制作关键字醒目显示控件
实现方式:WinForm自定义控件,继承系统Label控件实现. 第1步:创建“组件”,取名为:MarkLabel 第2步:修改添加如下代码: /* 添加命名空间引用: * using Sys ...
- StarUML之三、StarUML的项目
1:创建空的项目 创建项目可以按Ctrl+N或选择菜单File| New,StarUML安装打开后默认会有个空项目结构. 2:创建模板项目 可以通过选择模板来启动建模项目(会根据模板创建项目结构). ...
- Linux内核的LED设备驱动框架【转】
/************************************************************************************ *本文为个人学习记录,如有错 ...
- JavaScript九九乘法表
JavaScript九九乘法表 <script> for (var i = 1; i < 10; i++) { for (var j = 1; j <= i; j++) { d ...
- EasyUI表单验证插件扩展
$.extend($.fn.validatebox.defaults.rules, { regex: { validator: function (value, param) { var regex ...
- ArcGIS Runtime SDK for Android 加载shp数据,中文乱码问题
针对ArcGIS10.2版本的解决办法(默认中文编码为OEM): 现有一个图层名称为“图层.shp”,以此为例: 1.拷贝一个cpg文件,修改名称为“图层.cpg”,并用文本打开cpg文件修改编码为“ ...
- 使用VConsole调试代码
在真实手机上运行H5页面时,无法看到控制台.为了能在真实手机上使用控制台,可以加入如下代码实现控制台: //引入vconsole var isTestEnvironment =true if(isTe ...