二叉堆的介绍

2023-11-17

一、介绍

习惯上,我们将二叉堆简称为“堆”,二叉堆是以数组存储的完全二叉树。父节点值大于或等于其孩子节点值的,叫最大堆;父节点值小于或等于孩子节点值的,叫最小堆。最大堆的根节点的值最大,最小堆的根节点的值最小。下图为树形结构表示的堆:

二、二叉堆的性质

编号 性质
1 二叉堆是一棵完全二叉树
2 二叉堆的任意一个节点的优先级一定大于其两个子节点的
3 如果一个节点的下标为 x ,则其左孩子的下标为 2x ,右孩子的下标为 2x+1

三、堆的存储

由于堆是一颗完全二叉树,根据完全二叉树的性质,可以用数组来存储堆

定义一个堆

#define maxn 100
int  heap[maxn] ;  // 存储堆
int  len;        // 堆中元素个数

从图中可以看出:数组中i元素对应的左子树在数组的2i的位置上,右子树在2i+1的位置上,其父亲在floor(i/2)的位置上。利用该特性很容易在用数组存储的二叉堆中找出一个节点的左右子树和父亲节点。

在数组的存储方式下,堆有如下性质:
(1) 当用数组表示存储了n个元素的堆时,叶子结点的下标是 [n/2]+1,[n/2]+2,…,n
(2) 一个从小到大已排好序的数组是最小堆,反之则不然,因为堆的结构不唯一

四、插入元素

在堆中插入元素x,首先将元素x放到堆中的最后一个位置(即最底层最右边的位置),然后不断地把x往上调整,直到x调不动为止(即大于它现在的父亲,或者x处于根结点)。

举个例子,我们往数组中插入元素50,步骤如下:

 代码实现

void insert(int x) //将x放进堆 
{
    heap[++len] = x; //把当前数放进堆尾 
    int i = len; //i为要调整的数在heap[]中的位置 
    while (i > 1 && heap[i] < heap[i / 2])
        //还没调到堆头,因为是小根堆,要满足儿子大于父亲,如果儿子小于父亲说明需要调整 
    {
        swap(heap[i], heap[i / 2]);//儿子和父亲交换 
        i /= 2; //交换后要调整的数的位置也改变了 
    }
}

五、在堆中删除位置为k的元素

首先把位置k的元素和最后一个位置的元素交换,然后删去最后一个位置,这样k上的元素就被删除了,接着把位置k上的新元素不断下调,直到满足堆的性质。

  代码实现

void del(int k) //删除堆中位置为k的元素
{
    int i = k, j; //i:父亲 j:儿子 
    heap[k] = heap[len];
    len--; //将堆顶赋值为堆尾的数,再删除堆尾,调整堆顶的位置(往下移动) 
    while (i * 2 <= len)//把还没调到堆尾 
    {
        if (i * 2 == len || heap[i * 2] < heap[i * 2 + 1]) {
            j = i * 2;
         }           
        else {
            j = i * 2 + 1;
        }     
        //小根堆要满足父亲小于儿子,左儿子小于右儿子,j就是找左右儿子较小的那一个,与父亲进行交换 
        if (heap[j] < heap[i]) {
             swap(heap[j], heap[i]);
             i = j;
`        }

        //如果儿子小于父亲,可以交换,更新父亲的位置
        else return; //否则此时的二叉堆满足堆的性质,可以返回 
    }
}

 六、建立二叉堆

把元素不断插入到堆

代码实现

}
void make_heap()
{
    int x;
    for (int i = 1; i <= m; i++)//m为要建堆的元素个数
    {
        cin >> x;
        insert(x);
    }
}

参考:

c++ 二叉堆讲义(CMB整理)_楚颜a的博客-CSDN博客_c++ 二叉堆

c++ 二叉堆_KonjakLAF的博客-CSDN博客

c++实现二叉堆及堆排序_远走的兔子的博客-CSDN博客


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉堆的介绍 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • el-select中多选回显数据后没法重新选择和更改

    我用element select 多选回显的时候 回显正常 不能点击清除 不能选择改变数据 然后去搜了这篇文章文章链接 博主解释要在select标签上加一个强制渲染 如下图
  • Docker的网络模式

    目录 Docker的四种网络模式 1 Bridge 网络模式 类似于VMware的NAT模式 Bridge 网络模式介绍 bridge模式示意图 2 Host 网络模式 Host 网络模式介绍 Host模式示意图 3 Container 网
  • 【Redis】集合Set和底层实现

    文章目录 Redis 集合 Set Set简介 常用命令 应用场景 共同关注实例 整数集合 整数集合介绍 整数集合的升级 哈希表 哈希表的原理和实现 Redis中的哈希表 rehash 渐进式rehash Redis 集合 Set Set简
  • 如何用xp系统做服务器,xp系统如何做远程服务器呢

    xp系统如何做远程服务器呢 内容精选 换一换 网站的访问与云服务器的网络配置 端口通信 防火墙配置 安全组配置等多个环节相关联 任意一个环节出现问题 都会导致网站无法访问 本节操作介绍网站无法访问时的排查思路 网站无法访问怎么办 如果打开网
  • 14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序

    文章目录 1 实现高层网络操作的类 2 基于HTTP协议的网络文件下载 3 源码 3 1 可是化UI设计 3 2 mainwindow h 3 3 mainwindow cpp 1 实现高层网络操作的类 Qt 网络模块提供一些类实现 OSI
  • Synchronized的锁升级过程

    Synchronized的锁升级过程 synchronized锁升级过程 在synchronized中引入了偏向锁 轻量级锁 重量级锁之后 当前具体使用的是synchronzed中的那种类型锁 是根据线程竞争激烈程度来决定的 偏向锁 在锁对
  • vue使用luckysheet,引入图表chartmix,实现打印按钮功能

    1 下载Luckysheet源码 下载地址 https github com dream num Luckysheet 按照下载地址提示 npm run build 打包源码 生成dist文件夹 2 引入luckysheet的js文件和cs
  • TinyWebServer

    遇到的问题 1 Reactor和Proactor 当下开源软件能做到网络高性能的原因就是 I O 多路复用吗 是的 基本是基于 I O 多路复用 用过 I O 多路复用接口写网络程序的同学 肯定知道是面向过程的方式写代码的 这样的开发的效率
  • 数据可视化pyecharts绘制饼状图和环形图

    艰难做了新的作业练习 记录一下 from pyecharts import options as opts from pyecharts charts import Pie Page from pyecharts faker import
  • FC基本定义

    FC基本定义 虚拟化的软件有很多 华为开发的服务器虚拟化软件Fusioncompute CAN compute node agent 提供虚拟化功能 版本6 3之前是基于开源的xen开发的 6 3之后是基于开源的Kvm开发的 1 CAN V
  • 10月08日星期二 恒指/美原油/美黄金 走势分析

    财经早餐 2019年10月08日星期二 重点关注的财经数据与事件 07 50 日本8月贸易帐 09 45 中国9月财新服务业PMI 13 45 瑞士9月季调后失业率 14 00 德国8月季调后工业产出月率 14 45 法国8月贸易帐 18
  • Linux下创建所线程

    一 线程 线程是轻量级的进程 LWP light weight process 在 Linux 环境下线程的本质仍是进程 在计算机上运行的程序是一组指令及指令参数的组合 指令按照既定的逻辑控制计算机运行 操作系统会以进程为单位 分配系统资源
  • 百万前端之vue2.x最快上手

    1 创建项目 vue create 项目名 2 认识vue初始文件夹 3 安装插件 移动端安装vant ui pc端安装element ui Vue 2 项目 安装 Vant 2 npm i vant latest v2 S 安装axios
  • R_Studio(学生成绩)绘制频率分布直方图、分布饼图、折线比较图

    对 Gary csv 中的成绩数据进行分布分析 1 按0 59 60 69 70 79 80 89 90 100分组绘制高级语言程序设计成绩的频率分布直方图 2 按0 59 60 69 70 79 80 89 90 100分组绘制计算机导论
  • Sping为什么使用依赖注入而不使用实例化对象的方式?

    首先说明一下概念 依赖注入 Dependency of Injection 和控制反转 Inversion of Control 简称 ioc 是一个概念 具体含义 当某个角色 Java实例class A 调用者 需要另一个角色 另一个Ja
  • 专业心理咨询师助你轻装上阵,向内耗说不!

    引言 身为技术人 你是否经常感觉自己被掏空了精力 行动力不佳 又或者觉得自己的工作没有成就和意义 工作状态持续不佳 你是否总有一种无法消除的疲惫 即使没有学习 工作 而是选择看剧 刷短视频 甚至外出度假 也不能得到纾解 反而感到越来越累 实
  • 【MySQL安装问题】mysqld --initialize初始化报错

    在显示安装成功MySQL后 初始化mysqld initialize报错 错误显示如下 2023 04 03T709 05 28 842980Z O Warning TMESTAMP with implicit DEFAULT walue
  • pyltp 安装过程总结

    在安装pyltp的过程中踩了不少坑 这里对坑过程进行总结下 避免大家踩坑 第一步 安装pyltp 这里看别的blog给了两个方法 一个是直接pip 另一个是通过git clone pyltp的github 再通过python setup p
  • AD/DA模块使用说明及原理分析

    一 硬件资源 AD芯片 TLC549 DA芯片 TLC5615 LCD1602 LCD12864接口 6个独立按键 液晶背光可通过电位器 U6 调节 自带模拟测试信号 可通过 U20 调节测试信号幅值大小 二 模数转换 AD转换 1 知识背
  • 二叉堆的介绍

    一 介绍 习惯上 我们将二叉堆简称为 堆 二叉堆是以数组存储的完全二叉树 父节点值大于或等于其孩子节点值的 叫最大堆 父节点值小于或等于孩子节点值的 叫最小堆 最大堆的根节点的值最大 最小堆的根节点的值最小 下图为树形结构表示的堆 二 二叉