合并两个二叉搜索树


17

我正在寻找一种算法来合并两个任意大小和范围的二进制搜索树。我实现此目标的明显方法是找到整个子树,其范围可以适合另一棵树中的任意外部节点。然而,运行时间对于这类算法的最坏情况似乎是数量级的O(n+m)地方n,并m分别为每棵树的大小。

但是,有人告诉我可以在中完成此操作O(h),其中h的树的高度更大。我完全不知道这是怎么可能的。我尝试过先旋转一棵树,但是将一棵树旋转成脊柱已经是O(h)了。


我不知道埃里克,我也有同样的问题。

公平地说,这是算法作业中提出的一个问题。事实证明,O(h)的运行时间过于严格,因为该问题忘记了提供更多必要的信息:一棵树中的所有键都比右树中的所有键小。
efritz'3

我是否缺少某些东西,O(log n)通过简单的移动节点功能可以轻松地完成合并二叉树吗?
2012年

@AT是的,但是我们不知道一个BST的密钥与另一个BST是互斥的。
efritz 2012年

1
这是一棵红黑树,不是BST。红黑(以及AVL树和堆)是保留高度限制属性的特殊树种。香草BST可以是单个脊柱。尝试在BST中插入一系列不递减或不递增的数字,您会发现这些树的高度实际上是n。只有完整或完整的二叉树的高度与其节点总数成对数。
efritz 2012年

Answers:


24

ArXiv:1002.4248中,John Iacono和ÖzgürÖzkan描述了一种相对简单的算法,用于在摊销时间内合并两个二叉搜索树。分析是困难的部分。[ 更新:正如Joe在其答案中正确观察到的,该算法归功于Brown和Tarjan。]他们还基于有偏向的跳过列表描述了一种更复杂的字典数据结构,该结构支持在摊销时间内进行合并。O(log2n) O(logn)

另一方面,的最坏情况边界是不可能的。考虑两个具有节点的二进制搜索树,一个树存储到之间的偶数整数,另一个树存储到之间的奇数整数。合并两棵树创建一个新的二叉搜索树存储之间的所有整数和。在任何这样的树中,恒定部分的节点具有与其父节点不同的奇偶校验。(证明:奇数叶的父级必须是偶数。)因此,合并偶数树和奇数树需要更改指针。n 2 2 n 1O(logn)n22n12n112nΩ(n)


注意:如果我正确阅读了本文的说明,则这些树不支持插入和删除。该合并只是遵循合并手指搜索树的过程(乔的回答中所述)。受限的操作集比O n lg mO(lg2n)一。O(nlgmn)
jbapple 2012年

1
改进的分析归因于摊销,而不是对允许的操作的限制。插入和删除可以在同一摊销的时间范围内进行拆分和合并(实际上是“联接”)来支持。O(logn)
Jeffε

只是出于好奇,如果将树存储在数组中而不是链表中,时间是否会受到影响(我假设这是您在说“更改... 指针 ” 时的意思)?Ω(n)
mtahmed'2

默认情况下,“二进制搜索树”是基于指针的结构(不是“链接列表”);每个节点指向其两个孩子,也可能指向其父节点。但是下限并不取决于精确的表示形式。有合并两个n节点二进制搜索树的方法,因此任何基于比较的算法至少需要log2 2n(2nn)n比较,以选择合适的一个。log2(2nn)2nO(logn)
Jeffε

1
@Jɛff E:我同意支持拆分和联接,但是我不认为创建或销毁树是可行的。因此,例如,如果我想从字母表中删除“ x”,我不仅会得到“ a..wyz”,还会得到“ x”。Universe的大小(为,请参阅第2.1节)不会改变。另外,第1部分的简介还指出,集合必须对Universe进行分区,我对此解释(可能不正确)是指Universe中的每个元素都在某个树中。因此,按照我的阅读方式,这种构造不适用于无界的宇宙。这就是我应该在上面写评论的方式。n
jbapple 2012年

9

您可能会发现此参考资料很有帮助:Brown和Tarjan,一种快速合并算法,作者在其中展示了如何在是最佳的(用于基于比较的算法)。Ñ是由二进制搜索树表示的有序列表的长度,并假定ÑO(nlogmn)mnmn

您还可以在本文的第11.5节“ 手指搜索树”中看到有关合并有序集的不同技术的讨论。


2
时间限制,并且下限匹配假设ÑO(nlogmn)mn
Jeffε

我认为那是时间界限所隐含的,但我编辑了问题以使其明确。
2012年

0

1
他们的数据结构支持加入在O(1)分期时间,而不是合并。一棵树中的所有元素必须小于另一棵树中的所有元素。
Jeffε

啊,是的。必须重新阅读该文章:“ Join(T j)将两棵树合并为一棵树。在所有意义上,T j的所有元素小于或大于最小元素或最小元素,树T iT j被排序。T i的最大元素,不失一般性地假设w T i= w T j在这种情况下,将树T j附加到树T i上,该操作的结果是树TiTjTiTjTjTiw(Ti)=w(Tj)TjTi被附接到上的脊柱的节点 Ť “。TiTjTi
AT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.