如何平衡AVL树中的悬空节点

时间:2018-05-16 04:41:50

标签: avl-tree

我有一系列应该放入AVL树的数字:

50,22,80,70,75,73

我不确定73会去哪儿。根据我的理解,当75成为70的正确孩子时,第一个平衡发生了:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);

因此,80是“不平衡”节点,70是重左子节点。因此,向左移动70次,向右移动80次,不知何故,如下所示:

  50
 /  \
22   80
    /
  70
    \
    75 

添加73,我们又变得不平衡了:

      50
     /  \
    22   75
        /  \
       70   80

我如何平衡这个?我不能把73放在75到70之间,是吗?

1 个答案:

答案 0 :(得分:1)

有一个明确定义的程序来重新平衡AVL树。

  1. 从新插入的节点开始,然后移向root,直到找到不平衡的节点。
  2. 在非平衡节点上,确定其是重左还是右重。
  3. 如果它很重,而且右边的孩子也很重,那么你将不得不进行一次左旋。
  4. 如果它的右侧重物及其右侧儿童保持沉重(这个与您的情况相符),则必须进行左右双重旋转。
  5. 左侧重型箱有对称程序,我相信您可以自己弄明白。

    上述程序的psudocode看起来像这样。

         z=firstUnbalancedNode();
         if(rightHeavy(z))
         {
              if(rightHeavy(z.rightChild))
              {
                   rotateLeft(z.rightChild);
              }
              else
              {
                   rotateRight(z.rightChild)
                   rotateLeft(z.rightChild)
              }
          }
    

    在你的情况下

    1. 我们插入73并向上移动以找到不平衡节点(如果有)。
    2. 我们发现50是不平衡的。
    3. 50是重的,右儿(75)是重的,这意味着我们必须进行左右旋转。
    4. 插入树后看起来像这样

            50
           /  \
          22   75
              /  \
             70   80
               \
                73
      

      现在我们在50岁的右侧孩子(75)上进行正确的轮换。在这个旋转树看起来像这样

      之后
            50
           /  \
          22  70
                \
                 75
                /  \
               73   80
      

      在此之后我们必须在50岁的右边孩子(70)上进行左旋。这会将树转换为以下结构。

              70
             /  \
            50   75
           /    /  \
          22   73   80
      

      所以你可以看到有两个基本的旋转。左和右。 在某些情况下,单个旋转可以完成工作,而在其他情况下,您可能需要执行两个旋转。