将二叉堆的根和根的子代与堆的数组长度进行比较如何帮助确定您是不是有最小堆?
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 【问题描述】:波纹管是我感到困惑的方法。为什么k
、right
和left
需要大于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;
请记住,k
、left
和 right
是后备数组的索引。它们不是实际值。所以if (k > n)
没有将节点的值与数组长度进行比较,而是确保 index 在数组边界内。
greater(k, left)
所做的基本上是:
return a[left] > a[k];
假设k
是叶节点的索引。然后left
将是超出数组末尾的索引,greater
将尝试访问堆中不存在的元素。为了防止这种情况,代码确保left <= n
。
【讨论】:
以上是关于将二叉堆的根和根的子代与堆的数组长度进行比较如何帮助确定您是不是有最小堆?的主要内容,如果未能解决你的问题,请参考以下文章