【问题标题】:algorithm - How to concatenate two binary search tree efficiently?algorithm - 如何有效地连接两个二叉搜索树?
【发布时间】:2012-03-25 05:54:05
【问题描述】:

不是问如何合并两个二叉搜索树,就像这个问题How to merge two BST's efficiently?

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

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

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

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

  1. 可能会导致最终的大树不再平衡
  2. 如果最坏情况下的运行时间是O(h),其中h 是两棵树的最大高度怎么办?

实际上,《Algorithm Design Manual》这本书有这个消费税。我的简单解决方案足以完成这个练习吗?

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

谢谢

【问题讨论】:

    标签: algorithm data-structures


    【解决方案1】:

    令 A 为较小的集合。假设 x = maximum_element(A) 和 y = minimum_element(B)。

    我们知道 x z = (x+y)/2 的节点,并将 A 设为左子树,将 B 设为右子树。从此 BST 中删除添加的节点(使用密钥 z)。

    【讨论】:

    • 明确一点,这比你的回答要好,杰克逊,因为它不太可能使事情失衡。
    • @andrewcooke,是的,你是对的。只是在这里把答案说得更清楚:找到x和y后,从B中删除y,让y成为新的根,y.right = B.root, y.left = A.root。我想这个描述比涉及临时 z 节点更清楚。谢谢
    • 这个答案有两个问题: 1. 你不知道哪棵树更小,也无法在 O(h) 时间内确定。 2. 解要求 O(h) 解,不考虑平衡性。
    • @Tom,我们实际上可以在O(h) 时间内确定这一点,因为h 是两棵树的最大高度。因此,我认为杰克逊的答案也是可以接受的,但是这个答案产生了更好的(就平衡而言)结果树。我也喜欢你对最小高度的回答
    【解决方案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_Bh_A 大得多,我们最好将B 附加到max(A) 的右孩子而不是您当前的解决方案,后者将A 附加到min(B) 的左孩子。

    这是如何做到这一点的:

    1. 递归向下遍历A 的右侧和B 的左侧。
    2. 当您到达任一max(A)min(B) 时停止遍历。
    3. 以下三种情况之一是可能的:
      1. 你必须到max(A)。在这种情况下,设置max(A).right = B
      2. 你必须到min(B)。在这种情况下,设置min(B).left = A
      3. 你必须到max(A) min(B)。在这种情况下,请执行上述任一选项。

    我们最多遍历h_Ah_B 步骤,以较小者为准。即h 步骤。将一棵树附加到一个元素是恒定的。因此运行时间为 O(h)。

    【讨论】:

    • 如果问题中的h 被定义为两棵树的最大高度,为什么还要有h = min(h_A, h_B)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多