Language agnostic 完全二叉搜索树插入

Language agnostic 完全二叉搜索树插入,language-agnostic,binary-tree,Language Agnostic,Binary Tree,我有一个应用程序需要具有以下特征的数据结构: O(n)中的顺序遍历 在O中查找(日志n) 在O(对数n)中插入,空格为O(对数n)或更小 高效的就地存储(=树可以在没有孔的连续阵列中就地修改) 如果可能的话,进行迭代 不需要删除 我发现完整的二叉搜索树对于这些操作来说是一个很好的结构。我已经很容易地实现了遍历和查找(它们非常通用),但在插入方面却非常困难。我似乎无法插入任意元素并重新平衡树而不丢失shape属性(完整树)或partition属性(节点左侧的所有元素的比较严格小于节点) 我在网

我有一个应用程序需要具有以下特征的数据结构:

  • O(n)中的顺序遍历
  • 在O中查找(日志n)
  • 在O(对数n)中插入,空格为O(对数n)或更小
  • 高效的就地存储(=树可以在没有孔的连续阵列中就地修改)
  • 如果可能的话,进行迭代
  • 不需要删除
我发现完整的二叉搜索树对于这些操作来说是一个很好的结构。我已经很容易地实现了遍历和查找(它们非常通用),但在插入方面却非常困难。我似乎无法插入任意元素并重新平衡树而不丢失shape属性(完整树)或partition属性(节点左侧的所有元素的比较严格小于节点)

我在网上也找不到其他任何东西,我找到的唯一参考资料是关于一般二叉树(没有形状属性),不适用于我的情况。由于某些原因,完整的树木不受欢迎


有没有人为完整的二叉树实现了插入,并能给我一些关于如何稳健高效地实现插入的建议?这不是家庭作业,我需要一个真正的项目。

因为您需要在O(logn)中查找并在O(logn)中的任意位置插入,所以需要一个自平衡搜索树。完整的二叉树无法有效更新-它们被视为静态数据结构,用于只读场景。

哦,哇,这就解释了,我试图解决一个不可能解决的问题哈哈。但是,自平衡树不需要稀疏的存储阵列吗(或者需要打包/解包)?我想能够做的一切直接从一个文件的地方,没有临时存储。这是可能的吗?请解释“树可以在没有孔的连续阵列中就地修改”。什么时候?数组应该排序吗?这个数组可以被认为是只读的吗?@piotrek如中所述,树应该可以存储在一个数组中,而该数组没有任何空插槽。树必须支持在O(log n)时间内插入,但不需要删除。仍然无法获取它。假设结构是自平衡树。它实现了所有的运算都是O(lgn),空间是O(n),它可以是充分可迭代的。但下面没有阵列。创建这样的数组是O(n)时间和空间。此外,这种阵列的任何修改都不会影响原始结构。是“高效的就地存储”吗?@piotrek说这不起作用。我需要我的树能够从文件中以100%的存储效率就地读取。自平衡树不提供这种功能,因为即使树可能是平衡的,但它并不完整,因此当树存储到文件中时,会出现“间隙”。无法将树缓冲到内存中。我会使用排序数组,但不幸的是,它有O(n)个插入,因为插入点之后的元素需要上移。