【发布时间】:2012-10-18 10:40:50
【问题描述】:
我的应用程序需要具有以下特征的数据结构:
- O(n) 中的按序遍历
- 在 O(log n) 中查找
- 在 O(log n) 中插入,空间为 O(log n) 或更小
- 高效的就地存储(= 可以在没有孔的连续数组中就地修改树)
- 迭代,如果可能的话
- 不需要删除
我发现完整二叉搜索树对于这些操作来说是一个很好的结构。我已经很容易地实现了遍历和查找(它们非常通用),但是插入非常困难。我似乎无法插入任意元素并重新平衡树而不会丢失形状属性(完整树)或分区属性(节点左侧的所有元素都严格小于该节点)。
我在网上也找不到其他任何东西,我找到的唯一参考资料是关于一般二叉树(没有形状属性),不适用于我的情况。出于某种原因,完整的树不受欢迎。
有没有人为完整的二叉树实现了插入,并且可以给我一些关于如何稳健有效地实现它的指示?这不是家庭作业,我需要它来做一个真正的项目。
【问题讨论】:
-
请解释'可以在没有孔的连续数组中就地修改树'。在什么时间?数组应该排序吗?这个数组可以被认为是只读的吗?
-
@piotrek 就像这样,树应该可以存储在一个数组中,而该数组没有任何空槽。树必须支持在 O(log n) 时间内插入,但不需要删除。
-
还是不明白。假设结构是自平衡树。它完成的所有操作都是 O(lg n),空间是 O(n),它可以充分迭代。但下面没有数组。创建这样的数组是 O(n) 时间和空间。此外,对此类数组的任何修改都不会影响原始结构。它是“高效的就地存储”吗?
-
@piotrek 那行不通。我需要从文件以 100% 的存储效率 就地读取我的树。自平衡树不提供这一点,因为即使树可能是平衡的,它也不完整,因此当树存储到文件时会有“间隙”。树不能缓冲到内存中。我会使用一个排序数组,但不幸的是它有 O(n) 插入,因为插入点之后的元素需要向上移动。
标签: language-agnostic binary-tree