二叉堆(2)LeftistHeap
左倾堆,用于堆的快速合并。
规则:
① 节点的键值小于或等于它的左右子节点的键值。
② 节点的左孩子的NPL >= 右孩子的NPL。
③ 节点的NPL = 它的右孩子的NPL + 1。
测试文件 main.cpp:
#include <iostream>
#include "LeftistHeap.h"
using std::cout;
using std::endl;
int main()
{
LeftistHeap<int> lh(LeftistHeap<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;
;
}
头文件 "LeftistHeap.h":
#pragma once
#ifndef __LEFTISTHEAP_H__
#define __LEFTISTHEAP_H__
#include "BinaryTreeOperations.h"
template<typename _Ty>
class LeftistHeap
{
struct Node
{
_Ty key;
;
Node* left = nullptr;
Node* right = nullptr;
Node(const _Ty& _key) :key(_key) {}
};
public:
, MAXIMEM };
public:
LeftistHeap() = default;
LeftistHeap(HeapType _heapType) { heapType = _heapType; }
~LeftistHeap() { 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(LeftistHeap<_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 LeftistHeap<_Ty>::pop()
{
if (root == nullptr) throw std::exception("LeftistHeap is empty!");
Node* leftT = root->left;
Node* rightT = root->right;
delete root;
root = merge(leftT, rightT);
--size_n;
}
template<typename _Ty>
_Ty& LeftistHeap<_Ty>::top() const
{
if (root == nullptr) throw std::exception("LeftistHeap is empty!");
return root->key;
}
template<typename _Ty>
void LeftistHeap<_Ty>::push(const _Ty& _key)
{
Node* temp = new Node(_key);
root = merge(root, temp);
temp = nullptr;
++size_n;
}
template<typename _Ty>
void LeftistHeap<_Ty>::merge(LeftistHeap<_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 LeftistHeap<_Ty>::Node* LeftistHeap<_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);
if (_n1->left == nullptr || _n1->left->NPL < _n1->right->NPL) std::swap(_n1->left, _n1->right);
;
;
return _n1;
}
#endif // !__LEFTISTHEAP_H__
二叉堆(2)LeftistHeap的更多相关文章
- 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 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
随机推荐
- 【5min+】 设计模式的迷惑?Provider vs Factory
系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...
- WebSocket协议分析
WebSocket协议分析 1.什么是WebSocket协议 WebScoket协议是基于TCP协议建立的全双工通信,所谓的全双工通信就是双向同时通信. 2.WebSocket协议优点 WebSock ...
- git rm -r --cached解决已提交的文件在.gitignore中加入忽略后无效的问题。
有时候,发现有不该提交的文件已经提交后,仅仅在.gitignore中加入忽略是不行的.这个时候需要执行: git rm -r --cached 文件/文件夹名字 去掉已经托管的文件,然后重新提交: g ...
- MySQL数据库的备份、还原、迁移
一.单库备份与还原 1.远程连接MySQL数据库 D:\mysql-5.7.14-winx64\bin>mysql -h192.168.2.201 -uroot -pcnbi2018 参数说明: ...
- 1994_An Algorithm To Reconstruct Wideband Speech From Narrowband Speech Based On Codebook Mapping
论文地址:基于码本映射的窄带语音宽带重建算法 博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/12144324.html 摘要 本文提出了一种从窄带 ...
- Django 系列
Django基础 Django框架简介 Django 静态文件 Django request对象与ORM简介 Django路由系统 Django之视图层 Django之模板层 Django的setti ...
- TensorFlow安装-(Ubuntu18.04.3 & Anaconda3)
1.背景 使用ubuntu18.04.3安装Anaconda3之后使用网上教程安装tensorflow失败,踩了多个坑,特此总结经验 附官方教程:https://tensorflow.google.c ...
- python数据类型(第三弹)
本文着重介绍python语言的两种数据类型——列表和元组 列表 相比于整型.浮点型等数据类型,列表是一个复合数据类型,它更像一个容器,可以容纳多种不同类型的数据. 如上图:列表a中装进去了字符串&qu ...
- 第3种方法获取redis cluster主从关系
需求:使用cluster slots命令,获取redis cluster 主从对应关系. 说明:cluster slots命令对应的字段说明:http://redis.cn/commands/clus ...
- MAC安装MacPorts 卡在“正在运行软件包脚本”的解决办法
MAC安装MacPorts 卡在"正在运行软件包脚本"的解决办法 点击右上角强制结束掉"安装器" 打开terminal, 输入命令"ps -ef | ...