#include <iostream>
#include <vector>
#include <queue>
using namespace std;
template <typename T>
class LeftlistNode
{
public:
T key;
int npl;
LeftlistNode* left;
LeftlistNode* right; LeftlistNode(T& value, LeftlistNode* l = NULL, LeftlistNode* r = NULL, int n = ):
key(value), left(l), right(r), npl(n){}
}; template <typename T>
class LeftlistHeap{
private:
LeftlistNode<T>* mRoot;
public:
LeftlistHeap(){}
LeftlistHeap(vector<T>& items){
mRoot = buildHeap(items);
}
~LeftlistHeap(){
destory(mRoot);
}
void merge(LeftlistHeap<T>* other){
if(this == other)
return;
mRoot = _merge(mRoot, other->mRoot);
}
void insert(T& key){
mRoot = _merge(mRoot, new LeftlistNode<T>(key));
}
void remove(){
LeftlistNode<T> old = mRoot;
mRoot = _merge(mRoot->Left, mRoot->right);
delete old;
}
T get_min(){
return mRoot->key;
} void destory(LeftlistNode<T>* & mRoot){
if(mRoot == NULL)
return;
if(mRoot->left != NULL)
destory(mRoot->left);
if(mRoot->right != NULL)
destory(mRoot->right);
delete mRoot;
} private:
LeftlistNode<T>* _merge1(LeftlistNode<T>* x, LeftlistNode<T>* y){
if(x == NULL)
return y;
if(y == NULL)
return x;
if(x->key < y->key)
_merge2(x, y);
else
_merge2(y, x);
}
LeftlistNode<T>* _merge2(LeftlistNode<T>* x, LeftlistNode<T>* y){
if(x->left == NULL)
x->left = y;
else{
x->right = _merge1(x->right, y);
if(x->left->npl < x->right->npl){
LeftlistNode<T>* temp = x->left;
x->left = x->right;
x->right = temp;
}
x->npl = x->right->npl + ;
}
return x;
} LeftlistNode<T>* _merge(LeftlistNode<T>* x, LeftlistNode<T>* y){
if(x == NULL && y == NULL)
return NULL;
else if(x == NULL && y != NULL)
return y;
else if(y == NULL && x != NULL)
return x;
else{
if(x->key > y->key){
LeftlistNode<T>* tmp = x;
x = y;
y = tmp;
}
if(x->left == NULL)
x->left = y;
else{
x->right = _merge(x->right, y);
if(x->left->npl < x->right->npl){
LeftlistNode<T>* tmp = x->left;
x->left = x->right;
x->right = tmp;
}
x->npl = x->right->npl + ;
}
}
return x;
}
LeftlistNode<T>* buildHeap(vector<T>& items){
queue<LeftlistNode<T>*> tmp_queue;
for(int i = ; i < items.size(); ++i)
tmp_queue.push(new LeftlistNode<T>(items[i]));
while(tmp_queue.size() > ){
LeftlistNode<T>* t1 = tmp_queue.front();
tmp_queue.pop();
LeftlistNode<T>* t2 = tmp_queue.front();
tmp_queue.pop();
tmp_queue.push(_merge1(t1, t2));
}
return tmp_queue.front();
} }; int main(){
int a[]= {,,,,,,,};
vector<int> lt(a, a + );
LeftlistHeap<int> yj(lt);
cout << yj.get_min() << endl;
return ;
}

左倾堆C++实现的更多相关文章

  1. 纸上谈兵:左倾堆(leftist heap)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前讲解了堆(heap)的概念.堆是一个优先队列.每次从堆中取出的元素都是堆中 ...

  2. 左倾堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍左倾堆,它和二叉堆一样,都是堆结构中的一员.和以往一样,本文会先对左倾堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理 ...

  3. 左倾堆(二)之 C++的实现

    概要 上一章介绍了左倾堆的基本概念,并通过C语言实现了左倾堆.本章是左倾堆的C++实现. 目录1. 左倾堆的介绍2. 左倾堆的图文解析3. 左倾堆的C++实现(完整源码)4. 左倾堆的C++测试程序 ...

  4. 左倾堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了左倾堆,本章给出左倾堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 左倾堆的介绍2. 左倾堆的图文解析3. 左倾堆的Java实现(完整 ...

  5. 左倾堆(C#)

    参考:http://www.cnblogs.com/skywang12345/p/3638384.html using System; using System.Collections.Generic ...

  6. 二叉堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  7. 斜堆(一)之 C语言的实现

    概要 本章介绍斜堆.和以往一样,本文会先对斜堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文 ...

  8. 斜堆(二)之 C++的实现

    概要 上一章介绍了斜堆的基本概念,并通过C语言实现了斜堆.本章是斜堆的C++实现. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的C++实现(完整源码)4. 斜堆的C++测试程序 转载请注明出处 ...

  9. 斜堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了斜堆,本章给出斜堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的Java实现(完整源码)4. ...

随机推荐

  1. 【opencv实践】边缘检测

    边缘检测: 一.canny算子 Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子,也就是Canny算子.类似与 LoG 边缘检测方法,也属于先平滑后求导数的方法. 二.canny算 ...

  2. spark基础知识(1)

    一.大数据架构 并发计算: 并行计算: 很少会说并发计算,一般都是说并行计算,但是并行计算用的是并发技术.并发更偏向于底层.并发通常指的是单机上的并发运行,通过多线程来实现.而并行计算的范围更广,他是 ...

  3. 【软工作业&思考】关于软工的一些概念性理解暨第一次阅读作业

    概述 项目 内容 本次作业所属课程 2019BUAA软件工程 周二班 本次作业要求 第1次个人作业当然,比这个更重要百倍的还是实实在在的思考,这也是标题如此命名的原因 我在本课程的目标 在原有实践经验 ...

  4. 【作业3.0】HansBug的第三次博客规格总结

    转眼间第三次作业了,似乎需要说点啥,那就说点. 规格&工业 说到这个,不得不提一下软件开发的发展史. 历史的进程 早在上世纪50年代,就已经有早期的编程语言出现,也开始有一些程序编写者出现(多 ...

  5. Could not find a package configuration file provided by "Qt5Widgets"

    解决: sudo apt install qttools5-dev

  6. debug 2

    Red Hat Developer Toolsetdelivers the latest stable versions of essential GCC C, C++, Fortran, and s ...

  7. 记录一个nginx的配置

    rt #user xiaoju; worker_processes ; #error_log logs/error.log notice; #error_log logs/error.log debu ...

  8. 阿里云服务器配置https(port443)后客户端 svn check out 失效解决办法

    1. 客户端环境 1. 操作系统:Windows 7 2. svn客户端:TortoiseSVN 2. 服务端环境 1. 云服务平台:阿里云 2. 操作系统:Windows Server 2008 R ...

  9. neo4j-cypher

    cypher查询务必在需要查询的节点上加上标签,否则数据量一大查询就会非常慢(在查询时必须设置实体标签,否则不走索引),另外Neo4j索引做好了查询的优化基本上就完成了80%.需要注意index是建立 ...

  10. 洛谷P4770 [NOI2018]你的名字 [后缀自动机,线段树合并]

    传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长 ...