所以我正在尝试实现二进制最小堆。我了解二进制最小堆在结构和属性方面的含义。但是,当我尝试使用指针和节点来实现它时,我遇到了麻烦。
我正在使用具有Node
,right/left and pointers
和int element
的parent pointer
。我也有一个LastNode
指向最后插入的节点。
我的争吵是根据最后一个节点,我不知道插入元素时该怎么做。
这就是我的意思。
步骤1.)假设堆为空,因此创建一个root
即x,其中x包含元素,并设置root.left/right = null
和LastNode = root.left
。
X
/ \
0 0
这就是我卡住的部分。我知道当您创建另一个节点来存储另一个元素时,它将位于X的左侧或LastNode指向的位置。我的问题是,接下来我要对LastNode做什么,我将其指向x.right吗?我试图使
insert(int x)
在logN中运行,并且lastNode操作在每个级别上都将变得更长和更广泛。有人可以分解吗?
谢谢
最佳答案
好了,您需要在堆的最后一级插入元素,然后从那里找出是否需要冒泡。因此,您需要lastNode指针来指示不是最后插入的元素(它很可能是最后插入的元素,但现在可能已经成为根元素了;完全没有用),而是指示它的父元素您将在其中插入此新元素的位置。有帮助吗?
(稍后编辑):有一种构建堆的最佳方法,但是我觉得那不是您现在所需要的,因此这就是为什么我假设您将对每个新对象使用O(log n)的简单插入元件。