微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Ologn中平衡此AVL树?

如何解决如何在Ologn中平衡此AVL树?

假设您有2个AVL树U和V,以及一个元素x,使得U中的每个元素均 x。您如何合并U,V和x来创建AVL树?哪种算法会产生O(log(n))时间复杂度?

所以我知道答案是,您只需创建一个BST,将x作为根,将U作为左子节点,将V作为右子节点,然后重新进行平衡。但是我如何证明它具有O(log(n))复杂性呢?

解决方法

如果两棵树的高度相同或相差最大,则您的方法是正确的(并且不需要平衡)。但是,当它们之间的差异更大时,则没有。

我们可以递归解决问题:

def merge(U,x,V):
    if h(V) > h(U) + 1:
        V.left = merge(U,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,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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。