二叉堆(英语:binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。

当父节点的键值总是大于或等于任何一个子节点的键值时为“最大堆”。当父节点的键值总是小于或等于任何一个子节点的键值时为“最小堆”。

None
Some(90)
[90, 87, 61, 69, 31, 9, 23, 11]------------------
(program exited with code: 0)请按任意键继续. . .
use std::collections::BinaryHeap;
fn main() {let mut my_heap=BinaryHeap::new();println!("{:?}",my_heap.peek());let x=[11,31,9,87,90,61,23,69];for i in &x{my_heap.push(i);}println!("{:?}",my_heap.peek());println!("{:?}",my_heap);
}

二叉堆一般用数组来表示。如果根节点在数组中的位置是1,第n个位置的子节点分别在2n和 2n+1。因此,第1个位置的子节点在2和3,第2个位置的子节点在4和5。以此类推。这种基于1的数组存储方式便于寻找父节点和子节点。

如果存储数组的下标基于0,那么下标为i的节点的子节点是2i + 1与2i + 2;其父节点的下标是⌊floor((i − 1) ∕ 2)⌋。函数floor(x)的功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数(与“四舍五入”不同,向下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个值)。比如floor(1.1)、floor(1.9)都返回1。

如下图的两个堆:

1                                 11                          /      \                          /      \ 2         3                       9         10/    \     /   \                   /   \     /    \ 4      5   6     7                5      6   7      8/ \    / \                        / \    / \8  9   10 11                      1   2  3   4

将这两个堆保存在以1开始的数组中:

位置: 1 2 3 4 5 6 7 8 9 10 11
左图: 1 2 3 4 5 6 7 8 9 10 11
右图: 11 9 10 5 6 7 8 1 2 3 4
对于一个很大的堆,这种存储是低效的。因为节点的子节点很可能在另外一个内存页中。B-heap是一种效率更高的存储方式,把每个子树放到同一内存页。

如果用指针链表存储堆,那么需要能访问叶节点的方法。可以对二叉树“穿线”(threading)方式,来依序遍历这些节点。

rust(52)-二叉最大堆BinaryHeap相关推荐

  1. 【数据结构】堆和二叉堆

    1.什么是堆 堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质.堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h或h ...

  2. python最大堆_二叉堆 及 大根堆的python实现

    Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...

  3. 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理

    二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...

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

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

  5. 完全二叉树——二叉堆(BinaryHeap)

    前言 优先队列是允许至少下列两种操作的数据结构:insert(插入)以及deleteMin(删除最小者),其中deleteMin的工作是找出.返回.并删除优先队列中最小的元素.insert操作等价于e ...

  6. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

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

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

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

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

  9. 二叉堆与二叉堆的构建

    什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...

最新文章

  1. ks检验正态分布结果_【学习】AD, RJ和KS哪种正态性检验是最好的?
  2. libpcap原理阐述
  3. 两列高度自适应(转)
  4. 轴固定位置_3轴、3+2轴、5轴加工都有哪些区别?这篇文章给你整明白
  5. oracle定时任务的编写及查看删除
  6. java上传与下载文件_java实现文件的上传和下载功能
  7. 魅族MX4的线控电路图
  8. Xcode中的-ObjC和-all_load
  9. Win11系统怎样设置更改密码
  10. 【java SOAP】对SOAP的一个个人印象
  11. 关于C#函数对象参数传递的问题
  12. 12. JavaScript Number 对象
  13. JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法
  14. 面试 之 git工作流
  15. 【九天教您南方cass 9.1】 10 DTM土方计算的四种方法
  16. 计算机字体颜色太浅,我的打印机打字太淡,如何调,打印的字就能够颜色
  17. HTML颜色代码大全
  18. STM32L476+STM32cubeMx+Freemodbus移植记录
  19. 计算机中信息的表示方法 教案,计算机中的数的表示教案
  20. 对于开发软件的NABCD分析

热门文章

  1. css层叠上下文和层叠顺序
  2. CentOS编译安装PHP 7.0
  3. metaprogramming笔记
  4. 9.JAVA之GUI编程列出指定目录内容
  5. 为已创建好的临时表添加字段列
  6. 初学者学MvcMovie遇到的问题解决办法
  7. P1351 联合权值
  8. 第四次Scrum编码冲刺
  9. Async await 异步编程说明
  10. Okhttp、Volley和Gson的简单介绍和配合使用