in src/main/java/org/apache/commons/collections4/bidimap/TreeBidiMap.java [1206:1249]
private void doRedBlackDelete(final Node<K, V> deletedNode) {
for (final DataElement dataElement : DataElement.values()) {
// if deleted node has both left and children, swap with
// the next greater node
if (deletedNode.getLeft(dataElement) != null && deletedNode.getRight(dataElement) != null) {
swapPosition(nextGreater(deletedNode, dataElement), deletedNode, dataElement);
}
final Node<K, V> replacement = deletedNode.getLeft(dataElement) != null ? deletedNode.getLeft(dataElement) : deletedNode.getRight(dataElement);
if (replacement != null) {
replacement.setParent(deletedNode.getParent(dataElement), dataElement);
if (deletedNode.getParent(dataElement) == null) {
rootNode[dataElement.ordinal()] = replacement;
} else if (deletedNode == deletedNode.getParent(dataElement).getLeft(dataElement)) {
deletedNode.getParent(dataElement).setLeft(replacement, dataElement);
} else {
deletedNode.getParent(dataElement).setRight(replacement, dataElement);
}
deletedNode.setLeft(null, dataElement);
deletedNode.setRight(null, dataElement);
deletedNode.setParent(null, dataElement);
if (isBlack(deletedNode, dataElement)) {
doRedBlackDeleteFixup(replacement, dataElement);
}
} else if (deletedNode.getParent(dataElement) == null) {
// replacement is null
// empty tree
rootNode[dataElement.ordinal()] = null;
} else {
// deleted node had no children
if (isBlack(deletedNode, dataElement)) {
doRedBlackDeleteFixup(deletedNode, dataElement);
}
if (deletedNode.getParent(dataElement) != null) {
if (deletedNode == deletedNode.getParent(dataElement).getLeft(dataElement)) {
deletedNode.getParent(dataElement).setLeft(null, dataElement);
} else {
deletedNode.getParent(dataElement).setRight(null, dataElement);
}
deletedNode.setParent(null, dataElement);
}
}
}
shrink();
}