【问题标题】:How to find the left and right children of root in Leonardo heap?如何在Leonardo堆中找到root的左右孩子?
【发布时间】:2016-10-28 07:48:57
【问题描述】:

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

有人可以帮我理解吗?我正在尝试实现平滑排序。

【问题讨论】:

    标签: c++ data-structures tree smoothsort


    【解决方案1】:

    假设您有一个 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 处。)

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

    【讨论】:

    • 谢谢..我现在明白一点了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多