作为免责声明,我是该网站的新手,因此不太了解如何提问。请不要太苛刻,因为我真的只是想了解其中一些概念是如何工作的。如果我在开始时缺少理解,请告诉我,这样我就可以从那里开始,而不会浪费你的时间。这里什么都没有。因为我认为我的理解可能存在缺陷,所以我提出了一些关于堆如何在不同领域发挥作用的问题,然后尝试回答这些问题。
首先,我想帮助了解添加到空堆中的一组随机数字的外观。例如,我有 9、4、5、3、2、7、8、7。将其添加到堆后,堆会是什么样子?我可以直观地理解这一点(我认为)9 是根,4 是第一个左孩子等等,但由于这不是专门的树,而是一个堆,它会通过切换对数字进行排序吗它们(见“如果我的理解是正确的”段落),以便它们按最小或最大顺序排序?
现在假设我们从堆中删除了 9(我相信 9 将是根),我们将如何应对这种变化,然后将什么放入根中?我认为如果 9 是根节点,我们将取下一个最大的数字并将其复制到 9 的插槽中,而如果这是一个最小堆并且我们只是在底部删除一个节点,它只会被删除 no问题。
沿着类似的思路,获取数组中堆项的父项的公式是什么?--我想我明白这一点,如果父母在i,左孩子将在i * 2,右孩子将在i * 2 + 1。因此要找到父代,我们必须除以 i/2 才能找到父代。例如,如果我们在 i=7 处,父级将是 i=3,因为 3.5 将被截断,如果我们在 i=6 处,父级也将是 i=3。在这个例子中,i = 7 处的孩子将是 i = 3 的右孩子,而 i=6 将是 i = 3 的左孩子。
如果我对此的理解是正确的,那么在将新术语添加到根后进行重新整理,我会将孩子与父母进行比较,如果孩子更大,请切换术语。但是我需要比较两个孩子(如果有两个),看看哪个更大,然后决定哪个孩子需要交换。这将是一个最大堆,而另一个方向是最小堆。
最后,如果我在哪里添加根元素,它将如何重新堆积?