📜  数据结构和算法-AVL树

📅  最后修改于: 2021-01-11 10:28:01             🧑  作者: Mango


如果二进制搜索树的输入以排序(升序或降序)方式怎么办?然后看起来像这样-

BST不平衡

可以看出,BST的最坏情况性能最接近线性搜索算法,即Ο(n)。在实时数据中,我们无法预测数据模式及其频率。因此,需要平衡现有的BST。

AVL树以其发明者AdelsonVelskiLandis的名字命名,是高度平衡的二叉搜索树。 AVL树检查左子树和右子树的高度,并确保差异不超过1。该差异称为“平衡因子”

在这里我们看到第一棵树是平衡的,接下来的两棵树是不平衡的-

不平衡的AVL树

在第二棵树中, C的左子树的高度为2,而右边子树的高度为0,所以差为2。在第三棵树中, A的右子树的高度为2,而左子树的高度为2,所以它为0。 ,并且相差再次为2。 AVL树允许差异(平衡因子)仅为1。

BalanceFactor = height(left-sutree) − height(right-sutree)

如果左右子树的高度差大于1,则使用某些旋转技术来平衡树。

AVL旋转

为了平衡自己,AVL树可以执行以下四种旋转-

  • 左旋
  • 右旋
  • 左右旋转
  • 左右旋转

前两个旋转是单旋转,接下来的两个旋转是双旋转。要拥有不平衡的树,我们至少需要一棵高度为2的树。通过这棵简单的树,让我们一一理解它们。

左旋

如果树变得不平衡,则在将节点插入到右子树的右子树中时,我们将执行一次左旋转-

左旋

在我们的示例中,当节点插入到A的右子树的右子树中时,节点A变得不平衡。我们通过将A设为B的左子树来执行左旋转。

右旋

如果在左子树的左子树中插入节点,则AVL树可能变得不平衡。然后,树需要右旋转。

右旋

如图所示,通过执行右旋转,不平衡节点成为其左子节点的右子节点。

左右旋转

两次旋转是已经解释过的旋转形式的稍微复杂的版本。为了更好地理解它们,我们应注意旋转时执行的每个动作。让我们首先检查如何执行左右旋转。左右旋转是左旋转与右旋转的组合。

State Action
Right Rotation A node has been inserted into the right subtree of the left subtree. This makes C an unbalanced node. These scenarios cause AVL tree to perform left-right rotation.
Left Rotation We first perform the left rotation on the left subtree of C. This makes A, the left subtree of B.
Left Rotation Node C is still unbalanced, however now, it is because of the left-subtree of the left-subtree.
Right Rotation We shall now right-rotate the tree, making B the new root node of this subtree. C now becomes the right subtree of its own left subtree.
Balanced Avl Tree The tree is now balanced.

左右旋转

第二种双旋转是右旋转。它是向右旋转然后是向左旋转的组合。

State Action
Left Subtree of Right Subtree A node has been inserted into the left subtree of the right subtree. This makes A, an unbalanced node with balance factor 2.
Subtree Right Rotation First, we perform the right rotation along C node, making C the right subtree of its own left subtree B. Now, B becomes the right subtree of A.
Right Unbalanced Tree Node A is still unbalanced because of the right subtree of its right subtree and requires a left rotation.
Left Rotation A left rotation is performed by making B the new root node of the subtree. A becomes the left subtree of its right subtree B.
Balanced AVL Tree The tree is now balanced.