代码之家  ›  专栏  ›  技术社区  ›  Kay

二进制搜索树,如何旋转此树以平衡

  •  3
  • Kay  · 技术社区  · 6 年前

    我试图旋转一棵树来保持平衡,但是我在这个例子中遇到了困难。我不太确定我在这里做错了什么。

    我在树下的节点30处有L/R高度差1。所以,我想这棵树是平衡的。

         30
        /  \
       20  60
      /  \
     10  25 
    

    我在这里加了22,这是加了22之后得到的结果。

         30
        /  \
       20  60
      /  \
     10  25
        /
       22
    

    在节点20处,L/R高度差为1,但在节点30处,L/R高度差为2。所以,我想它已经不平衡了。我试着向右旋转树来平衡它,但我正在树下。

        20
       /  \
      10  30
         /  \
        25  60
       /
      22
    

    旋转后,节点20的L/R高度差仍为2。

    我哪里做错了?这棵树能用旋转来平衡吗?

    我可以使用下面的排序数组方法来平衡树,但是在这个例子中,我对旋转平衡感到非常困惑。

         22              25
        /  \            /  \
       20   30         20   30
      /    /  \       /  \   \
     10   25  60     10  22   60
    

    2 回复  |  直到 6 年前
        1
  •  3
  •   Dhiral Kaniya    6 年前

    AVL树中基本上有四种类型的旋转。

    • 右-左
    • 左-右
    • 向左
    • 右-右

    在您的情况下,左-右应该适用。

    这里需要执行两个步骤。

    1:-从20个节点向左旋转。所以你的树应该如下。

             30
            /  \
          25  60
         / 
       20 
      /  \
     10  22
    

    2:-从30个节点向右旋转。所以你的树应该如下。

         25
        /  \
       20   30 
      /  \   \
     10  22  60
    

    你可以参考N网站了解这种行为。这是最好的之一 link

        2
  •  3
  •   David Eisenstat    6 年前

    这种情况需要进行两次旋转:向上旋转25次。我假设您考虑的是AVL树,但在某些情况下,所有标准的平衡二叉树都需要进行双循环。