【问题标题】:Create an index tree (balanced BST) from a linked list从链表创建索引树(平衡 BST)
【发布时间】:2014-07-29 17:58:27
【问题描述】:

我有一个双向链表,我想从中创建一个索引树以提高随机访问性能。链表中的节点没有唯一标识,可以是派生 Node 对象的任何实例,该对象具有下一个和前一个引用。为了提高随机访问节点的性能,即列表的特定索引,我想在这个列表的顶部添加一个索引树。例如,用户可能想要检索列表的第三个节点,然后是第 5 个节点。 我想知道是否已经针对此问题提出了任何解决方案。

我想到的一个解决方案是使用一种特殊类型的二叉树,其中每个节点都保存一个数字。此数字将显示在其子引用中保留了多少节点。例如,如果根节点的编号是 5,这意味着列表有 5 个节点。想象一下左节点的编号是 3,右节点的编号是 2,这意味着前 3 个节点在左侧,其余 2 个在右侧。这将继续到具有数字 1 的叶子,该叶子将指向列表的节点。期望的树是平衡的 BST。

另一种方法是将列表中节点的索引视为其数据(因此对其进行排序)并使用Convert Sorted List to Balanced Binary Search Tree之类的内容。此外,在树节点中添加对实际列表节点的引用,以便编号(数据)为 2 的节点引用列表中的第二个节点。 我想知道从链表创建和维护这棵树的最快方法是什么?

提前谢谢你

编辑: 由于内存问题和持久性要求,我必须使用链接列表,而不仅仅是引用数组。这部分已经完成,所以考虑一个从头开始的链接列表。此外,您可以访问列表中的尾部和项目数。

【问题讨论】:

    标签: algorithm data-structures indexing binary-search-tree doubly-linked-list


    【解决方案1】:

    有一个简单的答案:指向列表中节点的指针数组。 要获取第三个节点,只需索引数组中的第三个元素。如果这样做,您将不再需要节点中的前一个和下一个成员;只需转到数组的上一个或下一个元素。

    如果你还想维护一个动态链表,只需使用 List (C#) 或 vector (C++) 代替数组,这样就可以插入和删除元素。

    【讨论】:

    • 这里的内存是个问题,我不能只将引用保存在数组中,这就是我们希望将元素保存在链表而不是数组中的主要原因。我需要实现自己的链接列表,而不是使用 List 或 Vector,因为我还需要持久性。但是,这不是我的问题,这部分已经完成。
    猜你喜欢
    • 2011-05-13
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多