• 堆排序(完全二叉树)最后一个非叶子节点的序号是n/2-1的原因


    堆排序是基于完全二叉树实现的,在将一个数组调整成一个堆的时候,关键之一的是确定最后一个非叶子节点的序号,这个序号为n/2-1,n为数组的长度。但是为什么呢?

    可以分两种情形考虑:

    ①堆的最后一个非叶子节点若只有左孩子

    ②堆的最后一个非叶子节点有左右两个孩子

    完全二叉树的性质之一是:如果节点序号为i,在它的左孩子序号为2*i+1,右孩子序号为2*i+2。

    对于①左孩子的序号为n-1,则n-1=2*i-1,推出i=n/2-1;

    对于②左孩子的序号为n-2,在n-2=2*i-1,推出i=(n-1)/2-1;右孩子的序号为n-1,则n-1=2*i+2,推出i=(n-1)/2-1;

    很显然,当完全二叉树最后一个节点是其父节点的左孩子时,树的节点数为偶数;当完全二叉树最后一个节点是其父节点的右孩子时,树的节点数为奇数。

    根据java语法的特征,整数除不尽时向下取整,则若n为奇数时(n-1)/2-1=n/2-1。

    因此对于②最后一个非叶子节点的序号也是n/2-1。

    得证。

    显然序号是从0开始的。

    为了得到而努力

    2019-03-16

    转载请注明来处

  • 相关阅读:
    文件下载断点续传插件webupload插件
    cocos2dx 2.x 粒子渲染时有黑色粒BUG
    VOIP NAT穿越之SIP信令穿越
    hdu 5086 Revenge of Segment Tree(BestCoder Round #16)
    [并发]线程池技术小白
    调用 COM 对象
    switch-case 执行顺序
    HDELETE
    python and java
    部分查询练习题及答案
  • 原文地址:https://www.cnblogs.com/malw/p/10542557.html
Copyright © 2020-2023  润新知