二叉堆分为大顶堆和小顶堆,是一颗完全二叉树。但是实际上的存储一般用数组存储。

大顶堆:任何父节点都比子节点大,但左右子节点大小情况任意。

小顶堆:任何父节点都比子节点小,但左右子节点大小情况任意。

typedef int Type;    // 键值类型
// 大顶堆
class MaxHeap {
public:bool Insert(Type key);       // 插入bool Delete(Type key);     // 删除MaxHeap(int C = 10) :capaity(C), size(0), heap(new Type[capaity]) {}
private:Type* heap;     // 堆实际存储结构int capaity;  // 堆的容量大小int size;      // 堆存入键值数
};

若一个节点在数组下标为 i,则

父节点下标为(i-1)/2;

左孩子下标(2*i)+1;

右孩子下标(2*i)+2


以大顶堆举例,大顶堆与小顶堆的区别仅在于下调和上调时的判断条件不同。

插入:

// 插入
bool MaxHeap::Insert(Type key) {if (size == capacity) return false;   // 已满heap[size] = key;     // 插入尾部// 将新插入的键值上移int index = size;           // 起始位置int P = (index - 1) / 2;while (index > 0) { if (heap[P] >= key) break;    // 若heap[P] <= key 则为小顶堆的判断条件heap[index] = heap[P];index = P;P = (index - 1) / 2;}heap[index] = key;++size;return true;
}

删除:

// 删除
bool MaxHeap::Delete(Type key){if (0 == size) return false;int index = 0;// 寻找到待删键值的位置for (; index < size; ++index) {if (heap[index] == key) break;}if (index == size)return false; // 不存在待删键值// 尾部键值替换待删键值heap[index] = heap[size - 1];int C = 2 * index + 1;while (C <= size) {if (C < size&&heap[C] < heap[C + 1]) C = C + 1;    // 选择左、右孩子当中较大的那个去替换if (heap[index] >= heap[C]) break;  // 不需要继续下移// 若heao[index] <= heap[C] 则为小顶堆的判断条件heap[index] = heap[C];index = C;C = 2 * index + 1;}--size;return true;
}

二叉堆(插入、删除)相关推荐

  1. 第十章 优先级队列 (b3)完全二叉堆:删除与下滤

    转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10276549.html

  2. 二叉堆(彻底整明白堆排序)

    数据结构与算法笔记 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博主的数据结构与算法的代码笔记 前言:之前写过堆排序,因为对堆数据结构还是不够了解,懵懵逼逼的写 ...

  3. 二叉堆的节点插入、删除以及构建过程

    目录 什么是二叉堆 二叉堆的基本操作 1.插入节点 2.删除节点 3.构建二叉堆 代码实现 什么是二叉堆 定义:二叉堆,本质上是一种完全二叉树. 分类:二叉堆分为最大堆和最小堆两种类型,最大堆和最小堆 ...

  4. java 二叉堆_二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...

  5. 数据结构之优先队列--二叉堆(Java实现)

    前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...

  6. 二叉堆的实现(最大堆)

    二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆. 最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆:父结点的键值总是小于或等于任何一 ...

  7. java 二叉堆_二叉堆的介绍和Java实现

    一.堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序 ...

  8. 【tree】二叉堆(大顶堆或小顶堆)

    本文目录 一.二叉堆的定义 结构性质 堆序性质 二.二叉堆的底层存储结构 三.二叉堆的插入 四.二叉堆的删除 五.源码和测试 系列目录 <树> <树的遍历> <二叉查找树 ...

  9. 二叉堆算法具体实现细节- Java实现

    前言:之前在学习二叉堆算法时,感觉自己明白了.但是当我自己去写代码的时候,或者回想的时候,却很难系统的描述出来.在仔细研究源码之后,发现了一些之前没有发现的新东西,特地,记录下来,供大家参考. 文章目 ...

  10. 数据结构之什么是二叉堆?

    文章目录 什么是二叉堆? 二叉堆的自我调整 插入节点 删除节点 构建二叉堆 最小二叉堆的实现 最小堆的构建 最小堆插入节点并上浮 最小堆删除节点并下沉 最小堆的完整代码实现 最后 什么是二叉堆? 二叉 ...

最新文章

  1. 驱动学习之LED驱动框架
  2. Android魔法(第四弹)—— 一步步实现百叶窗效果
  3. 5.IDA-文本搜索、二进制搜索(16进制字节序列)、替换16进制
  4. PHP的foeach用法
  5. Hi3520D UART2和UART3是如何加载到内核的
  6. delphi测试服务器响应时间,负载测试中的页面响应时间 - Visual Studio (Windows) | Microsoft Docs...
  7. 第一部分:MongoDB备忘录
  8. linux性能监控命令
  9. 数据科学可视化之要途
  10. 提高Java开发效率,Idea必装的几款插件
  11. UVA-Parentheses Balance
  12. 开发时浏览器缓存问题
  13. android-常用部件
  14. 计算机组成原理-概述篇
  15. LaTeX种数学符号公式编写
  16. AI公开课:人工智能领域之AI+制造行业之《人工智能+制造(智能制造)产业发展的现状/影响/+互联网、未来展望》课堂笔记
  17. Revit二次开发——设备自动接管插件的开发思路(入门实例教程)
  18. 十大免费教程资源帮助新手快速学习JavaScript
  19. 电脑中显示dns服务器可能不可用,DNS服务器可能不可用的解决方法
  20. 最新n1盒子openwr固件

热门文章

  1. 报错:Exception in thread “main“ java.io.IOException: 设备未就绪。
  2. Linux基础系列(2命令帮助的详细获取)
  3. unity 求出物体所在相机的横截面 解决调整 field Of View后场景物体和UI不匹配
  4. 最优化八:高斯牛顿法、LM法
  5. SQL查询 — 自连接的用法
  6. 转载:ZedGraph使用帮助
  7. 机器学习中L1正则化和L2正则化
  8. ECCV22 | ByteTrack:简单、高效、实用的多目标跟踪方法
  9. NP问题真的很难理解
  10. 什么是NP问题,NP-complete和NP-hard问题.