根据this article
树的根在位置L(k)-1。
Ltk-1子树的根在位置L(k-1)-1。
Ltk-2子树的根在位置L(k)-2。

有人可以帮我理解吗?我正在尝试实现Smoothsort。

最佳答案

假设您在数组中存储了一个k阶的Leonardo堆,然后递归进行布局,以便始终布置较大的子树,然后依次布置较小的子树和根节点。这意味着数组中将总共有L(k)个节点,其位置编号为0、1、2、3 ...,L(k)-1。它将看起来像这样:

+---------------------------+----------------------+------+
|    Tree of order k - 1    | Tree of order k - 2  | root |
+---------------------------+----------------------+------+

注意,根在最后,所以它在位置L(k)-1上,因为我们使用零索引。

那么这两个子树在哪里?好吧,k-2阶子树紧接在根节点之前。它的布局方式是其根在最右边。因此,要找到它的根,我们转到整棵树的根(位置L(k)-1),然后备份一步,直到位置L(k)-2。

那么k-1阶子树呢?好吧,请注意,它很舒适地位于我们代表的最前面。它的根节点将在该块的末尾,即位置L(k-1)-1(类似于我们更大的k阶树的根在位置L(k)-1的情况。)

希望您喜欢我的文章! :-)

09-06 21:37