【问题标题】:More than one rotation needed to balance an AVL Tree?平衡 AVL 树需要不止一次旋转?
【发布时间】:2014-01-21 15:25:59
【问题描述】:

我的最佳猜测是,当您从已经平衡的 AVL 树中插入或删除一个元素时,一次旋转总是足以平衡 AVL 树。

转一圈就够了吗? 在需要多次旋转的情况下,一个示例会有所帮助。

PS:我将 RL/LR 旋转算作一次旋转。

【问题讨论】:

    标签: data-structures tree rotation binary-tree avl-tree


    【解决方案1】:

    对于插入,最多旋转 1 次。
    对于删除,旋转次数以 O(log(n)) 为界。 Log(n) 是树的高度。
    关于 AVL 删除的更多解释。 当你从 AVL 中删除一个节点时,你可能会导致树不平衡,你必须追溯到它不平衡的点。如果不平衡点是根。您必须从上到下重新平衡树。

    【讨论】:

    • 我不敢相信,除非你给我拿一个需要 2 次旋转的例子。
    • @BlueFlame 我把链接放在上面,你可以看到很多例子。向下滚动可以看到logn删除。
    • 再次检查。在所有这些示例中,树在删除之前都是平衡的。就像我在问题中所说的,在插入/删除操作之前,树是平衡的。
    • @IanWalker0421 - 为“请继续,州长”+1 :)
    • 如何证明插入时只需要旋转1次?
    【解决方案2】:

    对于插入,我相信一个就足够了。

    但要删除: 考虑这棵树:

                     50
                  /      \
                25       75
               /   \    /   \
              15   40  60    80
                   /  /  \    \
                  35 55  65   90
                         /
                        62
    

    删除15,先破坏25的平衡因子,一转:

                     50
                  /      \
                35       75
               /   \    /   \
              25  40  60    80
                      /  \    \
                     55  65   90
                         /
                        62
    

    但是,我们还是要检查一下,现在树的根的平衡因子被破坏了,必须再次旋转:

                     60
                  /      \
                50       75
               /   \     /  \
              35   55   65   80
             /  \       /     \
            25  40     62     90
    

    【讨论】:

    • 我知道这是一个旧答案。但是你能告诉我当 50 的(根)平衡因子不合适时你是如何旋转树的吗?
    • 根的平衡因子是 100% 正确的。在它的左边,一个高度为 2 的子树。在它的右边,高度为 3。没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多