我不询问如何合并两个二叉搜索树,因为这个问题确实How to merge two BST's efficiently?
我真的在问如何连接两棵树。因此,如果树A的所有节点都小于树B的任何节点,我们可以连接两棵树。但我该如何有效地做到这一点?
我的想法是找到树B的最小值,然后让树A成为最小的左子(树B)。
这很简单,时间是O(height of B)
。
但我想这个解决方案有一些问题:
O(h)
,其中h
是两棵树的最大高度怎么办?实际上,“Algorithm Design Manual”这本书有这个消费税。我的简单解决方案是否适合这项练习?
连接操作需要两组S1和S2,其中S1中的每个键都小于S2中的任何键,并将它们合并在一起。 提供一种算法将两个二叉搜索树连接成一个二叉搜索树。最坏情况下的运行时间应为O(h),其中h是两棵树的最大高度。
由于
答案 0 :(得分:7)
设A为较小的集合。假设x = maximum_element(A)和y = minimum_element(B)。
我们知道x<年。获取一个键值等于z = (x+y)/2
的节点,并将A作为其左子树,将B作为右子树。从此BST中删除添加的节点(使用键z
)。
答案 1 :(得分:2)
我要定义:
h_A
= A
h_B
= B
h = min(h_A, h_B)
您的解决方案最差情况下的运行时间为O(h_B)
,当min(B)
的深度为h_B
时会发生这种情况。
问题是O(h)
最坏的情况。最好使用O(h)
解决方案,因为如果h_B
远大于h_A
,我们最好将B
附加到max(A)
的正确子项上您当前的解决方案,将A
附加到min(B)
的左侧子项。
以下是如何做到这一点:
A
的右侧和B
的左侧。max(A)
或min(B)
max(A)
。在这种情况下,请设置max(A).right = B
min(B)
。在这种情况下,请设置min(B).left = A
max(A)
和 min(B)
。在这种情况下,请执行上述任一选项。我们最多遍历h_A
或h_B
个步骤,以较小者为准。也就是说,h
步骤。将一棵树附加到元素是不变的。因此运行时间为O(h)。