【问题标题】:Complete binary search tree insertion完成二叉搜索树插入
【发布时间】: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


【解决方案1】:

由于您希望在 O(log n) 中查找并在 O(log n) 中的任意位置插入,因此您需要一个自平衡搜索树。完整的二叉树无法有效更新 - 它们被认为是为只读场景制作的静态数据结构。

【讨论】:

  • 哦,哇,这就解释了,我试图解决一个不可能的问题哈哈。但是自平衡树不需要一个稀疏数组来存储(或者需要以某种方式打包/解包)?我希望能够直接从文件就地完成所有操作,而无需临时存储。这可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
相关资源
最近更新 更多