#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. avg 的使用

    select * from emp where sal>(select avg(sal) as ssalfrom emp);--要求查询出高于公司平均工资的全部雇员信息

  2. laravel-mix的安装

    Laravel-mix的安装 Laravel Mix 是一款前端任务自动化管理工具,使用了工作流的模式对制定好的任务依次执行.Mix 提供了简洁流畅的 API,让你能够为你的 Laravel 应用定义 ...

  3. 模拟登陆github

    import requests from lxml import etree class Login(object): def __init__(self): self.headers = { 'Re ...

  4. MySQL数据库 Too many connections

    出现这种错误明显就是 mysql_connect 之后忘记 mysql_close:当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个, ...

  5. /usr/bin/ld: warning: libavformat.so.57, needed by /home/camera.so, not found (try using -rpath or -rpath-link)

    ffmpeg中,使用libavformt.so.57时,查找不到. 解决方案: 修改ld.so.conf文件,添加路径. sudo gedit /etc/ld.so.conf 在文件末尾添加路径 /u ...

  6. 虚拟机上的centos7链接不上网络: activation of network connection failed

    报错: 重启网络也不行: 解决: 1.打开网络配置文件: $vi /etc/sysconfig/network-scripts/ifcfg-ens33  (可以参照这里的描述,找到这个文件https: ...

  7. pwnable.tw dubblesort

    (留坑,远程没打成功) int __cdecl main(int argc, const char **argv, const char **envp) { int t_num_count; // e ...

  8. form表单老忘的

    禁止拉伸 textarea{ resize:none; } 左侧 label 对齐注意事项 必须要和 label-width 共同使用,才会生效. 表单域标签的宽度,直接写入 Form, 子元素 fo ...

  9. 利用 v-html 将后台数据中的换行符在页面输出

    在拿到后台传入的数据时:有些换行符,空格等会直接输出在页面   (/n .<br/> 等) 用  v-html 来解决: <div v-html="message" ...

  10. Mac上重置mysql 5.7密码

    Mac上重置mysql 5.7密码 >我的mac系统是osx 10.12 装完mysql5.7之前根本登录不上,网上说用DMG方式装完后,后弹出一个框,上面会有临时密码,但是我安装的时候却手一抖 ...