每天一点算法-堆(Day9)

作者: 岛民小强 | 来源:发表于2019-01-06 19:12 被阅读8次

    上一篇介绍了完全二叉树,今天介绍的就是一颗完全二叉树,但要被放到数组里做实现。

    最大堆、最小堆

    最小堆(小根堆):所有父结点小于子结点的堆。
    最大堆(大根堆):所有父结点大于子结点的堆。

    堆操作

    的操作一般有以下基本操作:上浮(子结点与其父结点互换位置)、下沉(父结点与其子结点互换位置)、插入pop(删除最大堆中的最大值或者最小堆中的最小值)等。为了实现这些,需要给结点按顺序定一个下标,并用数组来存放。即:

    若某结点的下标为i, 则其左儿子的下标为2*i+1右儿子的下标为2*i+2

    以下是一个小根堆存放数组示例:

    下面介绍两个比较重要的操作——插入pop

    插入

    不破坏原的规则的情况下插入一个结点。以上面的小根堆为例,现在尝试插入一个结点"27":

    插入操作流程

    pop

    pop操作第一步是把根结点删除,没了根就不能是堆了,于是可以先把最后一个结点充当根(若是以其他结点补充到根会使还原堆的规则更复杂),接下来要做的就是还原最大堆和最小堆的特性(父子结点关系),以小根堆为例的流程:

    1.删除原有根;
    2.最后一个结点充当根,值记做M;
    3.M与其左右子结点中,若两个子节点都大于M,则完成还原,退出流程;若有子结点大于M,则取大于M中的左右子节点中最大的一个与M互换;
    4.M重复第3步直到完成还原或者M已经是叶节点。

    图示(画图软件很费时间,手画吧,字丑了点请见谅):


    pop操作

    感谢阅读!欢迎关注!持续更新中...

    相关文章

      网友评论

        本文标题:每天一点算法-堆(Day9)

        本文链接:https://www.haomeiwen.com/subject/cfgsrqtx.html