二叉堆(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 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
随机推荐
- Vue之Vuex的使用
重点看懂这张图: 重点记住: 1.Mutation 必须是同步函数,即mutations里只能处理同步操作. 2.如果处理的是同步操作可直接commit提交mutations更改state,如果是异步 ...
- 图像分割:Semantic/Instance/Panoramic Segmentation
一. 背景介绍 语义分割(Semantic Segmentation):对一张图片上的所有像素点进行分类,同一物体的不同实例不需要单独分割出来. 实例分割(Instance Segmentation) ...
- [MongoDB]评估使用mongodb的五个因素
企业选择 NOSQL 或非表格结构数据库,评估时应从以下五个关键维度来考虑:• 数据模型的类型• 查询模型是否能满足灵活的查询需求• 事务模型类型,以及一致性属于强一致性还是最终一致性• APIs 的 ...
- NIO、多路复用的终极奥义
1.现在要让有限的系统资源发挥更大的效率,一个最直接的方式就是进行资源复用,比如线程资源复用. 2.线程资源复用的一个最有效的方式就是使用事件驱动模型进行异步调用. 3.Reactor模型就是基于事件 ...
- 大白话工厂方法模式(Factory Method)
目录 简单工厂模式缺陷 简单工厂模式改造 工厂方法模式定义 工厂方法模式结构 工厂方法模式分析 参考文献 简单工厂模式缺陷 大白话简单工厂模式(Simple Factory Pattern)中通过买车 ...
- vue 路由过渡动效
<router-view> 是基本的动态组件,所以我们可以用 <transition> 组件给它添加一些过渡效果: <transition name="slid ...
- Cesium案例解析(五)——3DTilesPhotogrammetry摄影测量3DTiles数据
目录 1. 概述 2. 案例 3. 结果 1. 概述 3D Tiles是用于传输和渲染大规模3D地理空间数据的格式,例如摄影测量,3D建筑,BIM / CAD,实例化特征和点云等.与常规的模型文件格式 ...
- net start MySQL57 MySQL57 服务正在启动 . MySQL57 服务无法启动。
造成这种情况的原因有很多,如果直接百度错误信息的话,不一定能很快解决问题,所以,出现这种情况,我们可以使用 mysqld --console 命令来查看报错信息,然后根据报错信息来百度,这样就很快定位 ...
- 2、CentOS7密码重置
一.重启系统,在开机过程中,快速按下键盘上的方向键↑和↓.目的是告知引导程序,我们需要在引导页面选择不同的操作,以便让引导程序暂停. 以下是暂停后的界面,可以查看下方的英文可知↑和↓的作用. 二. ...
- Vue整合d3.v5.js制作--柱状图(rect)
先上效果图: 图中柱状图变成纯蓝色是鼠标滑动过的颜色(颜色可改,本人配色能力十分的强,建议直接用默认设置即可 ( ᖛ ̫ ᖛ )ʃ)) 1.环境说明 Vue版本:"vue": &q ...