从链表创建索引树(平衡BST)

时间:2014-07-29 17:58:27

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

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

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

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

提前谢谢

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

1 个答案:

答案 0 :(得分:0)

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

如果您仍想维护动态链接列表,只需使用List< Node> (C#)或向量<节点*> (C ++)而不是数组,因此可以插入和删除元素。