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

时间:2018-07-07 10:44:15

标签: algorithm binary-search-tree

我正在尝试旋转一棵树以保持其平衡,但是在此示例中我遇到了困难。我不太确定自己在做什么错。

我在节点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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

  • 右-左
  • 左左
  • 右对

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

在这里您需要执行两个步骤。

1:-从20个节点向左旋转。因此,您的树应如下所示。

         30
        /  \
      25  60
     / 
   20 
  /  \
 10  22

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

     25
    /  \
   20   30 
  /  \   \
 10  22  60

您可以参考N网站来了解其行为。这是最好的link

之一