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

Algorithm 算法-如何有效地连接两个二叉搜索树?,algorithm,data-structures,Algorithm,Data Structures,我不是像这个问题那样询问如何合并两个二叉搜索树 我真的在问如何连接两棵树。所以如果树A的所有节点都比树B的任何节点都小,我们可以连接两棵树。但我如何有效地做到这一点 我的想法是找到树B的最小值,然后让树A成为最小值(树B)的左子树 这很简单,时间是O(B的高度) 但我想这个解决方案有一些问题: 这可能会导致最后一棵大树不再平衡 如果最坏情况下的运行时间是O(h),其中h是两棵树的最大高度,该怎么办 实际上,这本书有这样的附加说明。对于这个练习,我的简单解决方案足够了吗 串联操作采用两个集合S1和

我不是像这个问题那样询问如何合并两个二叉搜索树

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

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

这很简单,时间是
O(B的高度)

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

  • 这可能会导致最后一棵大树不再平衡
  • 如果最坏情况下的运行时间是
    O(h)
    ,其中
    h
    是两棵树的最大高度,该怎么办
  • 实际上,这本书有这样的附加说明。对于这个练习,我的简单解决方案足够了吗

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


    谢谢

    让A成为较小的一组。假设x=最大元素(A),y=最小元素(B)

    我们知道xz=(x+y)/2的节点,将a作为其左子树,将B作为其右子树。从此BST中删除添加的节点(使用键
    z
    )。

    我将定义:

    • h\u A
      =
      A的最大高度
    • h_B
      =最大高度
      B
    • h=min(h\u A,h\u B)
    您的解决方案最糟糕的运行时间是
    O(h\u B)
    ,当
    min(B)
    的深度为
    h\u B
    时会发生这种情况

    该问题要求在最坏情况下使用
    O(h)
    。A
    O(h)
    解决方案更可取,因为如果
    h\u B
    h\u 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)。

    很清楚,这比你的答案要好,Jackson,因为它不太可能使事情不平衡。@andrewcooke,是的,你是对的。在这里,只需让答案更清楚:在找到x和y之后,从B中删除y,让y成为新的根,y.right=B.root,y.left=A.root。我想这个描述比涉及tempz节点更清楚。谢谢这个答案有两个问题:1。你不知道哪棵树更小,也无法在O(h)时间内确定。2.这个解要求一个O(h)解,而不考虑平衡。@Tom,我们实际上可以在
    O(h)
    时间内确定,因为
    h
    是两棵树的最大高度。因此,我认为Jackson的答案也是可以接受的,但这一个产生了更好的结果树(在平衡方面)。我也喜欢你关于最小高度的回答,如果在问题中
    h
    被定义为两棵树的最大高度,为什么你有
    h=min(h\u A,h\u B)