Exemple #1
0
  @Override
  protected void balance(AVLNode<T> node) {
    /* Rotation cases (N = node, C = child)
     * Case 1:
     *     N
     *    /
     *   C
     *  /
     * O
     *
     * Case 2:
     *   N
     *  /
     * C
     *  \
     *   O
     *
     * Case 3:
     * N
     *  \
     *   C
     *    \
     *     O
     * Case 4:
     * N
     *  \
     *   C
     *  /
     * O
     */

    if (node == null) return;
    int bf = node.getBalanceFactor();

    if (bf == 2) {
      AVLNode<T> child = node.getLeftChild();

      if (child.getBalanceFactor() == -1) // Case 2
      rotateLeft(child);

      rotateRight(node); // Case 1
    } else if (bf == -2) {
      AVLNode<T> child = node.getRightChild();

      if (child.getBalanceFactor() == 1) // Case 4
      rotateRight(child);

      rotateLeft(node); // Case 3
    } else balance(node.getParent()); // Recurrsively balance parent
  }