左倾堆C++实现
#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++实现的更多相关文章
- 纸上谈兵:左倾堆(leftist heap)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前讲解了堆(heap)的概念.堆是一个优先队列.每次从堆中取出的元素都是堆中 ...
- 左倾堆(一)之 图文解析 和 C语言的实现
概要 本章介绍左倾堆,它和二叉堆一样,都是堆结构中的一员.和以往一样,本文会先对左倾堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理 ...
- 左倾堆(二)之 C++的实现
概要 上一章介绍了左倾堆的基本概念,并通过C语言实现了左倾堆.本章是左倾堆的C++实现. 目录1. 左倾堆的介绍2. 左倾堆的图文解析3. 左倾堆的C++实现(完整源码)4. 左倾堆的C++测试程序 ...
- 左倾堆(三)之 Java的实现
概要 前面分别通过C和C++实现了左倾堆,本章给出左倾堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 左倾堆的介绍2. 左倾堆的图文解析3. 左倾堆的Java实现(完整 ...
- 左倾堆(C#)
参考:http://www.cnblogs.com/skywang12345/p/3638384.html using System; using System.Collections.Generic ...
- 二叉堆(一)之 图文解析 和 C语言的实现
概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...
- 斜堆(一)之 C语言的实现
概要 本章介绍斜堆.和以往一样,本文会先对斜堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文 ...
- 斜堆(二)之 C++的实现
概要 上一章介绍了斜堆的基本概念,并通过C语言实现了斜堆.本章是斜堆的C++实现. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的C++实现(完整源码)4. 斜堆的C++测试程序 转载请注明出处 ...
- 斜堆(三)之 Java的实现
概要 前面分别通过C和C++实现了斜堆,本章给出斜堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的Java实现(完整源码)4. ...
随机推荐
- Kafka(二)设计原理
1.持久性 kafka使用文件存储消息,这就直接决定kafka在性能上严重依赖文件系统的本身特性.且无论任何OS下,对文件系统本身的优化几乎没有可能.因为kafka是对日志进行append操作,因此磁 ...
- word20170102日用家电 household appliances
1. Vacuum cleaner: 吸尘器 2.Cordless vacuum cleaner: 无线吸尘器 3.Robotic vacuum cleaner: 机器人吸尘器 动词:to vacuu ...
- $HOME
Ubuntu中 命令行输入$HOME bash: /home/XXX: Is a directory $HOME 是用户主目录
- Redis从入门到精通【centos下的安装】
上传redis 到服务器 解压并重命名 然后yum -y install gcc-c++ zlib zlib-devel pcre pcre-devel openssl openssl-devel 然 ...
- docker基础命令汇总
搜索镜像 docker search 镜像名称 例如:docker search centos7 下载镜像 docker pull 镜像名称 例如:docker pull centos7 启动容器 d ...
- Python 猜数游戏
import random//引用随机数rand=random.randint(0,99)t=0while 1: //用t来记录使用次数 t+=1 //自行输入一个随机数 aNumber=int(in ...
- 【原创】用python连接thrift Server 去执行sql的问题总汇
场景:python和现有产品的结合和应用——python的前瞻性调研 环境:centos7 0.首先确保安装了python和pyhive,下面是连接代码: #!/usr/bin/env python ...
- eclipse下properties文件中文乱码的解决方案
今天在工程下编辑.properties文件时输入了中文然后就保存出错,弄了好久才搞定!大家瞄瞄 在中文操作系统下,Eclipse中的Java类型文件的编码的默认设置是GBK,但是对Properties ...
- poj 1741
点分治入门题 首先发现是树上点对的问题,那么首先想到上点分治 然后发现题目要求是求出树上点对之间距离小于等于k的对数,那么我们很自然地进行分类: 对于一棵有根树,树上的路径只有两种:一种经过根节点,另 ...
- 敏捷开发相关编辑思想(SOA、DDD、REST、CQRS)
这是第一次写有关编程思想的东西. 1.理解Martin Fowler提出的SOA(面向服务歧义) 2.理解DDD(Domain-Driven Design领域驱动设计): http://blog.cs ...