GNU libavl 2.0.1
Author: Ben Pfaff

5.4.5 Symmetric Case |

Finally, we need to write code for the case that we chose not to discuss earlier, where the insertion occurs in the right subtree of y. All we have to do is invert the signs of balance factors and switch avl_link[] indexes between 0 and 1. The results are this:

    157. <Rebalance AVL tree after insertion in right subtree 157> =
    struct avl_node *x = y->avl_link[1];
    if (x->avl_balance == +1)
      {
        <Rotate left at y in AVL tree 158>
      }
    else
      {
        <Rotate right at x then left at y in AVL tree 159>
      }

This code is included in 151 and 162.

    158. <Rotate left at y in AVL tree 158> =
    w = x;
    y->avl_link[1] = x->avl_link[0];
    x->avl_link[0] = y;
    x->avl_balance = y->avl_balance = 0;

This code is included in 157 and 532.

    159. <Rotate right at x then left at y in AVL tree 159> =
    assert (x->avl_balance == -1);
    w = x->avl_link[0];
    x->avl_link[0] = w->avl_link[1];
    w->avl_link[1] = x;
    y->avl_link[1] = w->avl_link[0];
    w->avl_link[0] = y;
    if (w->avl_balance == +1)
      x->avl_balance = 0, y->avl_balance = -1;
    else if (w->avl_balance == 0)
      x->avl_balance = y->avl_balance = 0;
    else /* w->avl_balance == -1 */
      x->avl_balance = +1, y->avl_balance = 0;
    w->avl_balance = 0;

This code is included in 157, 174, 310, 428, and 533.

5.4.4 Step 4: Rebalance | 5.4 Insertion | 5.4.6 Example