如何在 O(log(n)) 中平衡这个 AVL 树?

How to balance this AVL Tree in O(log(n))?

假设您有 2 棵 AVL 树 U 和 V 以及一个元素 x,使得 U 中的每个元素 < x 并且 V 中的每个元素 > x。您将如何合并 U、V 和 x 以创建 AVL 树?什么算法会产生 O(log(n)) 时间复杂度?

所以我知道答案是您只需创建一个以 x 为根、U 为左 child 和 V 为右 child 的 BST,然后重新平衡。但是我如何证明这具有 O(log(n)) 复杂性?

如果两棵树的高度相同或最多相差一棵,则您的方法是正确的(不需要平衡)。但是,当它们相差更多时,情况并非如此。

我们可以递归地解决这个问题:

def merge(U, x, V):
    if h(V) > h(U) + 1:
        V.left = merge(U, x, V.left)
        # Note that h(V.left) can only increase, by at most 1,
        # so one rotation can fix all issues.
        if h(V.left) > h(V.right) + 1:
            V = rotate-right(V)
        return V

    if h(U) > h(V) + 1:
        U.right = merge(U.right, x, V)
        if h(U.right) > h(U.left) + 1:
            U = rotate-left(U)
        return U

    return new-node(x, U, V)

请注意,我们在每次调用中最多执行恒定量的工作,外加可选的单个递归调用。因此复杂度为O(recursion_depth)。但是也应该很容易看出,递归深度受限于树高的差异U, V。而且每个都有 O(log n) 的高度,因此我们可以得出结论 merge 也是 O(log n)