将二叉堆的根和根的子代与堆的数组长度进行比较如何帮助确定您是不是有最小堆?

Posted

技术标签:

【中文标题】将二叉堆的根和根的子代与堆的数组长度进行比较如何帮助确定您是不是有最小堆?【英文标题】:How does comparing a binary heap's root and root's children to the heap's array length help determine whether you have a min heap?将二叉堆的根和根的子代与堆的数组长度进行比较如何帮助确定您是否有最小堆? 【发布时间】:2018-08-17 04:30:10 【问题描述】:

波纹管是我感到困惑的方法。为什么krightleft需要大于n

// is subtree of pq[1..n] rooted at k a min heap?
    private boolean isMinHeap(int k) 
        if (k > n) return true;
        int left = 2*k;
        int right = 2*k + 1;
        if (left  <= n && greater(k, left))  return false;
        if (right <= n && greater(k, right)) return false;
        return isMinHeap(left) && isMinHeap(right);
    

【问题讨论】:

二叉堆是满足堆排序属性的完全二叉树。排序可以是以下两种类型之一: min-heap 属性:每个节点的值大于或等于其父节点的值,最小值元素位于根节点。 https://www.cs.cmu.edu/~adamchik/15-121/lectures/Binary%20Heaps/heaps.html 【参考方案1】:

长度检查的原因是确保您不会尝试访问数组末尾的元素。你有这个代码:

    if (k > n) return true;
    int left = 2*k;
    int right = 2*k + 1;
    if (left  <= n && greater(k, left))  return false;
    if (right <= n && greater(k, right)) return false;

请记住,kleftright 是后备数组的索引。它们不是实际值。所以if (k &gt; n) 没有将节点的值与数组长度进行比较,而是确保 index 在数组边界内。

greater(k, left) 所做的基本上是:

return a[left] > a[k];

假设k 是叶节点的索引。然后left 将是超出数组末尾的索引,greater 将尝试访问堆中不存在的元素。为了防止这种情况,代码确保left &lt;= n

【讨论】:

以上是关于将二叉堆的根和根的子代与堆的数组长度进行比较如何帮助确定您是不是有最小堆?的主要内容,如果未能解决你的问题,请参考以下文章

二叉堆

二叉堆

最大堆与堆排序和优先队列

二叉堆的构建(Java)

二叉堆的高效实现

二叉堆和d-堆的性能比较