所以我正在尝试实现二进制最小堆。我了解二进制最小堆在结构和属性方面的含义。但是,当我尝试使用指针和节点来实现它时,我遇到了麻烦。

我正在使用具有Noderight/left and pointersint elementparent pointer。我也有一个LastNode指向最后插入的节点。

我的争吵是根据最后一个节点,我不知道插入元素时该怎么做。
这就是我的意思。

步骤1.)假设堆为空,因此创建一个root即x,其中x包含元素,并设置root.left/right = nullLastNode = root.left

  X
 / \
0   0


这就是我卡住的部分。我知道当您创建另一个节点来存储另一个元素时,它将位于X的左侧或LastNode指向的位置。我的问题是,接下来我要对LastNode做什么,我将其指向x.right吗?我试图使insert(int x)在logN中运行,并且lastNode操作在每个级别上都将变得更长和更广泛。

有人可以分解吗?
谢谢

最佳答案

好了,您需要在堆的最后一级插入元素,然后从那里找出是否需要冒泡。因此,您需要lastNode指针来指示不是最后插入的元素(它很可能是最后插入的元素,但现在可能已经成为根元素了;完全没有用),而是指示它的父元素您将在其中插入此新元素的位置。有帮助吗?

(稍后编辑):有一种构建堆的最佳方法,但是我觉得那不是您现在所需要的,因此这就是为什么我假设您将对每个新对象使用O(log n)的简单插入元件。

10-07 23:29