# 2018-09-27 17:35:58 我实现的这个treap不能算是堆。有问题

  最近对堆这种结构有点感兴趣,然后想用指针的方式实现一个堆而不是利用数组这种结构,于是自己想到了一个用二叉树结构实现堆的算法,下面是主要操作的源码:

  头文件:

#ifndef _HEAP_H__
#define _HEAP_H__ #include <iostream>
#include <vector> template<class type>
class BaseNode {
private:
type val;
BaseNode *left, *right;
public:
BaseNode() {}
BaseNode(type v) : val(v), left(nullptr), right(nullptr) {}
/**/
void value(type val) { this->val = val; }
void lchild(BaseNode *left) { this->left = left; }
void rchild(BaseNode *right) { this->right = right; }
type value() { return val; }
BaseNode* lchild() { return left; }
BaseNode* rchild() { return right; }
}; template<class type>
class treap : protected BaseNode<type> {
BaseNode<type> *root;
size_t count;
public:
treap() : root(nullptr), count(0) {}
treap(std::vector<type> iter_type_vec) {
for (int i = 0; i < iter_type_vec.size(); i++)
insert(iter_type_vec[i]);
}
~treap() {
delete root;
}
bool empty() const {
if (count == 0)
return true;
return false;
}
size_t size() const {
return count;
}
type top() const {
if (empty())
{
std::cout << "Underflow!" << std::endl;
return -1;
}
return root->value();
}
void show() const {
travel(root);
std::cout << std::endl;
};
void insert(type val);
void remove();
void travel(BaseNode<type> *pr) const;
}; #endif // _HEAP_H__

  定义函数的实现:

#include "Heap.h"

template<class type>
void treap<type>::insert(type val)
{
BaseNode<type> *node = new BaseNode<type>(val);
if (!root)
root = node;
else if (root->value() <= val)
{
node->lchild(root);
root = node;
}
else
{
if (root->lchild() && root->rchild()) {
BaseNode<type> *pr = root;
while (pr) {
if (pr->lchild() && pr->lchild()->value() > val)
pr = pr->lchild();
else if (pr->rchild() && pr->rchild()->value() > val)
pr = pr->rchild();
else
break;
}
if (!pr->lchild())
pr->lchild(node);
else if (!pr->rchild())
pr->rchild(node);
else {
BaseNode<type> *tem = pr->lchild();
pr->lchild(node);
node->lchild(tem);
}
}
else if (!root->lchild())
root->lchild(node);
else
root->rchild(node);
}
++count;
} template<class type>
void treap<type>::remove()
{
if (!empty())
{
if (root->lchild() && root->rchild())
{
if (root->lchild()->value() > root->rchild()->value())
{
BaseNode<type> *rr = root->rchild();
root = root->lchild();
BaseNode<type> *tem = root->rchild();
if (!tem)
root->rchild(rr);
else {
BaseNode<type> *pr = root->rchild();
while (pr) {
if (pr->lchild() && pr->lchild()->value() > rr->value())
pr = pr->lchild();
else if (pr->rchild() && pr->rchild()->value() > rr->value())
pr = pr->rchild();
else
break;
}
if (!pr->lchild())
pr->lchild(rr);
else
pr->lchild(rr);
}
}
else {
BaseNode<type> *rr = root->lchild();
root = root->rchild();
BaseNode<type> *tem = root->lchild();
if (!tem)
root->lchild(rr);
else {
BaseNode<type> *pr = root->lchild();
while (pr) {
if (pr->lchild() && pr->lchild()->value() > rr->value())
pr = pr->lchild();
else if (pr->rchild() && pr->rchild()->value() > rr->value())
pr = pr->rchild();
else
break;
}
if (!pr->lchild())
pr->lchild(rr);
else
pr->rchild(rr);
}
}
}
else if (root->lchild())
root = root->lchild();
else
root = root->rchild();
--count;
}
} template<class type>
void treap<type>::travel(BaseNode<type> *pr) const
{
if (pr) {
std::cout << pr->value() << ' ';
travel(pr->lchild());
travel(pr->rchild());
}
}

  测试:

#include <iostream>
#include <vector>
#include "Heap.cpp" int main()
{
std::vector<int> nums{1,5,3,2,4};
treap<int> trees; for (auto v : nums)
trees.insert(v); std::cout << "当前堆节点个数:" << trees.size() << std::endl; std::cout << "遍历堆树:";
trees.show();
std::cout << std::endl; while (!trees.empty()) {
std::cout << "当前堆顶数据:" << trees.top() << std::endl;
trees.remove();
} return 0;
}

  运行结果:

  在Windows上VS和CodeBlocks上都测试成功了,VS上是代码都在一个文件中测试的,codeblocks上不知道为什么必须用 #include "Heap.cpp" 而不能用 #include "Heap.h",否则会报错。。。

  CentOS7 gcc 8.1.0也测试成功了:

treap(堆树)的更多相关文章

  1. K:Treap(堆树)

      Treap=Tree+Heap.Treap是一棵二叉排序树,它的左子树和右子树分别是一个Treap,和一般的二叉排序树不同的是, Treap记录一个额外的数据, 就是优先级.Treap在以关键码构 ...

  2. Treap(树堆)入门

    作者:zifeiy 标签:Treap 首先,我么要知道:Treap=Tree+Heap. 这里: Tree指的是二叉排序树: Heap指的是堆. 所以在阅读这篇文章之前需要大家对 二叉查找树 和 堆( ...

  3. 「模板」「讲解」Treap名次树

    Treap实现名次树 前言 学平衡树的过程可以说是相当艰难.浏览Blog的过程中看到大量指针版平衡树,不擅长指针操作的我已经接近崩溃.于是,我想着一定要写一篇非指针实现的Treap的Blog. 具体如 ...

  4. 查找——图文翔解Treap(树堆)

    之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...

  5. *衡树 Treap(树堆) 学习笔记

    调了好几个月的 Treap 今天终于调通了,特意写篇博客来纪念一下. 0. Treap 的含义及用途 在算法竞赛中很多题目要使用二叉搜索树维护信息.然而毒瘤数据可能让二叉搜索树退化成链,这时就需要让二 ...

  6. Treap(树堆)

    treap是排序二叉树的一种改进,因为排序二叉树有可能会造成链状结构的时候复杂度变成O(n^2)所以通过随机一个优先级的方法来维持每次让优先级最大的作为树根,然后形成一个满足: A. 节点中的key满 ...

  7. Treap(树堆):随机平衡二叉树实现

    本文是根据郭家宝的文章<Treap的原理及实现>写的. #include<stdio.h> #include<string.h> #include<stdli ...

  8. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  9. Treap——堆和二叉树的完美结合,性价比极值的搜索树

    大家好,今天和大家聊一个新的数据结构,叫做Treap. Treap本质上也是一颗BST(平衡二叉搜索树),和我们之前介绍的SBT是一样的.但是Treap维持平衡的方法和SBT不太一样,有些许区别,相比 ...

随机推荐

  1. Django objects.all()、objects.get()与objects.filter()之间的区别介绍

    前言 本文主要介绍的是关于Django objects.all().objects.get()与objects.filter()直接区别的相关内容,文中介绍的非常详细,需要的朋友们下面来一起看看详细的 ...

  2. python web django base skill

    web框架本质 socket + 业务逻辑 框架实现socket tonado node.js 使用WSGI实现socket django flask 自己实现框架思路 wsgiref socket ...

  3. JS高级---原型的引入,原型添加的方法解决数据共享

    原型的引入:解决:通过构造函数创建对象带来的问题,即浪费内存(一个对象开一个内存,多个对象开多个内存) 通过原型来添加方法,解决数据共享,节省内存空间 <script> function ...

  4. web前端技能考核(阿里巴巴)

  5. 制作PPT时的一些技巧记录

    1.当一页PPT上有很多图片,要选择其中一张图片时,发现图片都重叠了,不好选择时该怎么办? 2.对动画的编辑 技巧:与选择窗口配合使用

  6. opencv:自定义滤波

    卷积核的定义 均值卷积核 // 自定义滤波 - 均值卷积 int k = 15; Mat mkernel = Mat::ones(k, k, CV_32F) / (float)(k * k); Mat ...

  7. C:指针基础

    内存概述 内存 内存含义: 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分. 内存:内部存贮器,暂存程序/数据--掉电丢失 SRAM.DRAM.DDR.DDR2.DDR3 ...

  8. jmeter循环读取数据库中的数据

    1,添加一个jdbc请求 2,添加一个循环控制器,循环的次数为sql返回的记录数${var_#} 3,添加一个计数器(用来做变量拼接) 4,拼接变量,往目标接口发请求 最后脚本的构造如下:

  9. jdk 9 10 11 12 13 新特性

    jdk 9 新特性 1.集合加强 jdk9 为所有集合(List/Set/Map)都增加了 of 和 copyOf 方法,用来创建不可变集合,即一旦创建就无法再执行添加.删除.替换.排序等操作,否则将 ...

  10. 2_1 aabb

    输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相同).