@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 }