算法 - 如何有效地连接两个二叉搜索树?

时间:2012-03-07 17:03:33

标签: algorithm data-structures

询问如何合并两个二叉搜索树,因为这个问题确实How to merge two BST's efficiently?

我真的在问如何连接两棵树。因此,如果树A的所有节点都小于树B的任何节点,我们可以连接两棵树。但我该如何有效地做到这一点?

我的想法是找到树B的最小值,然后让树A成为最小的左子(树B)。

这很简单,时间是O(height of B)

但我想这个解决方案有一些问题:

  1. 它可能导致最终的大树不再平衡
  2. 如果最差情况下的运行时间为O(h),其中h是两棵树的最大高度怎么办?
  3. 实际上,“Algorithm Design Manual”这本书有这个消费税。我的简单解决方案是否适合这项练习?

      

    连接操作需要两组S1和S2,其中S1中的每个键都小于S2中的任何键,并将它们合并在一起。 提供一种算法将两个二叉搜索树连接成一个二叉搜索树。最坏情况下的运行时间应为O(h),其中h是两棵树的最大高度。

    由于

2 个答案:

答案 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)的左侧子项。

以下是如何做到这一点:

  1. 递归遍历A的右侧和B的左侧。
  2. 当您到 max(A)min(B)
  3. 时停止遍历。
  4. 三件事之一是可能的:
    1. 你必须max(A)。在这种情况下,请设置max(A).right = B
    2. 你必须min(B)。在这种情况下,请设置min(B).left = A
    3. 您必须max(A) min(B)。在这种情况下,请执行上述任一选项。
  5. 我们最多遍历h_Ah_B个步骤,以较小者为准。也就是说,h步骤。将一棵树附加到元素是不变的。因此运行时间为O(h)。