如何删除(min-)堆中的最后一个节点?

时间:2017-08-27 10:47:42

标签: algorithm tree heap binary-tree

我正在学习考试,目前我正在学习。我已经了解了如何从堆中删除节点,但我发现我无法使用该算法删除。

问题是我想删除15这是一个叶子和最小堆的最后一个节点。当您删除堆中的节点时,您正在查找堆的最后一个节点,将其替换为删除节点并检查此节点的子节点是否大于它..然后以递归方式继续此操作。

出于这个原因(15是最后一个元素,没有孩子),我不知道如何删除它。

        1
     /     \
    9       6
   / \     /
 17  11   8
 /
15

我认为你可以删除它而不做任何其他事情。你基本上自己替换它,因为删除节点=最后一个节点..?所以它看起来像是:

        1
     /     \
    9       6
   / \     /
 17  11   8

我希望你能帮助我,我真的需要知道,对于我的考试而言,我无法在互联网上找到有关该案例的任何内容。

1 个答案:

答案 0 :(得分:2)

删除最后一个节点是一项非常简单的任务 - 只需将其删除,无需执行任何操作(除非递减计数器并根据需要调整数组大小)。一般来说,功能交换项目本身没有任何改变(虽然完成了无用的工作),但你可以检查项目是否是最后一项并省略交换。

请注意,删除非head元素是一个罕见的问题(你必须提供对它的显式访问),大多数算法只使​​用最顶层的元素。

另请注意,您的图片没有显示有效的二进制堆,因为堆是完整二进制树,并且所有级别(除了最后一个)必须完全填充,但是您的树有空位置第三行。