in src/main/java/org/apache/commons/collections4/bidimap/TreeBidiMap.java [1341:1402]
private void doRedBlackInsert(final Node<K, V> insertedNode, final DataElement dataElement) {
Node<K, V> currentNode = insertedNode;
makeRed(currentNode, dataElement);
while (currentNode != null
&& currentNode != rootNode[dataElement.ordinal()]
&& isRed(currentNode.getParent(dataElement), dataElement)) {
if (currentNode.isLeftChild(dataElement)) {
final Node<K, V> y = getRightChild(getGrandParent(currentNode, dataElement), dataElement);
if (isRed(y, dataElement)) {
makeBlack(getParent(currentNode, dataElement), dataElement);
makeBlack(y, dataElement);
makeRed(getGrandParent(currentNode, dataElement), dataElement);
currentNode = getGrandParent(currentNode, dataElement);
} else {
//dead code?
if (currentNode.isRightChild(dataElement)) {
currentNode = getParent(currentNode, dataElement);
rotateLeft(currentNode, dataElement);
}
makeBlack(getParent(currentNode, dataElement), dataElement);
makeRed(getGrandParent(currentNode, dataElement), dataElement);
if (getGrandParent(currentNode, dataElement) != null) {
rotateRight(getGrandParent(currentNode, dataElement), dataElement);
}
}
} else {
// just like clause above, except swap left for right
final Node<K, V> y = getLeftChild(getGrandParent(currentNode, dataElement), dataElement);
if (isRed(y, dataElement)) {
makeBlack(getParent(currentNode, dataElement), dataElement);
makeBlack(y, dataElement);
makeRed(getGrandParent(currentNode, dataElement), dataElement);
currentNode = getGrandParent(currentNode, dataElement);
} else {
//dead code?
if (currentNode.isLeftChild(dataElement)) {
currentNode = getParent(currentNode, dataElement);
rotateRight(currentNode, dataElement);
}
makeBlack(getParent(currentNode, dataElement), dataElement);
makeRed(getGrandParent(currentNode, dataElement), dataElement);
if (getGrandParent(currentNode, dataElement) != null) {
rotateLeft(getGrandParent(currentNode, dataElement), dataElement);
}
}
}
}
makeBlack(rootNode[dataElement.ordinal()], dataElement);
}