堆的构建

本文介绍了堆的数据结构及其特性,重点讲解了如何构建小根堆。通过找到非叶子节点,逐个检查并调整以满足小根堆条件,直至所有节点满足堆的性质。最后,文章给出了构建堆的代码实现过程。
摘要由CSDN通过智能技术生成
  1. 堆的定义:
    如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做大根堆,根节点最小的堆叫做小根堆。
  2. 堆的特性:
    堆中某个节点的值总是不大于或不小于其父节点的值;
    堆总是一棵完全二叉树。
  3. 如何构建堆:首先找到一个乱序的完全二叉树(这里任意取一个举例)
    在这里插入图片描述
    首先找到完全二叉树中最后一个不是叶子节点中的节点,也就是图中的21的位置,在代码中可以根据公式:(最后一个节点的位置 - 1) / 2.就是最后一个不为叶子节点的位置.
    找到这个节点后向下查找(这里以小根堆为例),找到子节点中最小的节点,然后判断与自身的关系,若满足小根堆条件(parent < child),则退出,若不满足则交换节点的值,这里将16 与 21交换
    在这里插入图片描述
    交换之后,若parent为叶子结点(panent->leftchild越界)则退出,否则继续向下查找,直到parent为叶子结点或子树满足小根堆.这里21已经是叶子节点,所以退出向下查找过程.
    之后找到倒数第二个不为叶子节点的节点,依上述步骤向下查找,直到将所有不为叶
    子结点的节点都向下查找一遍.
    这里继续将3向下查找,3的子树满足小根堆,退出向下查找.
    在这里插入图片描述
    之后继续向前遍历,找到节点12向下查找,在子节点中找到3 和 16中较小的3,不满足小根堆的性质,交换12 和 3,
    在这里插入图片描述
    交换完成之后12此处的节点依旧不是叶子结点,继续向下查找,找到叶子节点中较小的7,仍不满足小根堆的性质,继续交换
    在这里插入图片描述
    此时12 成为叶子结点,退出向下查找,由于根节点已经向下查找完毕,所以堆的构建也就完成了.此时一个乱序的完全二叉树就已经变成了一个小根堆.
    接下来,看一下代码部分如何实现:
//堆的初始化
void Init(Data* val, heap
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值