【问题标题】:How should an AVL tree be rotated if it is both a right-right case and right-left case?如果AVL树既是右-右情况又是右-左情况,应该如何旋转?
【发布时间】:2023-02-23 02:53:27
【问题描述】:

下图中的AVL树是通过去掉子树T0中的一个叶子节点生成的。

删除节点后,树变得不平衡。

我应该将以下情况视为右-右情况还是右-左情况?

【问题讨论】:

    标签: avl-tree


    【解决方案1】:

    它是一个是的是的情况下,因为节点 ? 的平衡因子不是负数(它为零)。

    维基百科关于 AVL rebalancing 的部分列出了这些可能性,但请注意节点的标记不同:

    令 X 为具有(临时)平衡因子 −2 或 +2 的节点。它的左子树或右子树被修改了。让 Z 成为更高的孩子 [...]

    • 右 右 ⟹ Z 是其父 X 的右孩子并且 BF(Z) ≥ 0
    • [...]
    • Right Left ⟹ Z 是其父 X 的右孩子并且 BF(Z) < 0

    为你的树使用这个标签,你会这样描绘它:

            ____44____             BF(X): 2
           /    X     
         17          __62__        BF(Z): 0
        /          /  Z   
       10  21   __50_       78
               /          /  
             48      54   72  88
            /      /       /  
           45  49  52  56   81  92
    

    所以我们处于第一种情况(即对对)。

    维基百科继续采取行动:

    并且重新平衡的执行方式不同:

    • 右 右 ⟹ X 通过简单的旋转重新平衡rotate_Left

    这个简单的旋转将给出这棵树:

              ____62____
             /    Z     
         __44__          78
        /  X           /  
      17      __50_    72   88
     /      /            /  
    10  21  48      54    81  92
           /      /  
          45  49  52  56
            
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      相关资源
      最近更新 更多