in src/main/java/org/apache/commons/collections4/trie/AbstractPatriciaTrie.java [2184:2258]
private void removeInternalEntry(final TrieEntry<K, V> h) {
if (h == root) {
throw new IllegalArgumentException("Cannot delete root Entry!");
}
if (!h.isInternalNode()) {
throw new IllegalArgumentException(h + " is not an internal Entry!");
}
final TrieEntry<K, V> p = h.predecessor;
// Set P's bitIndex
p.bitIndex = h.bitIndex;
// Fix P's parent, predecessor and child Nodes
{
final TrieEntry<K, V> parent = p.parent;
final TrieEntry<K, V> child = p.left == h ? p.right : p.left;
// if it was looping to itself previously,
// it will now be pointed from its parent
// (if we aren't removing its parent --
// in that case, it remains looping to itself).
// otherwise, it will continue to have the same
// predecessor.
if (p.predecessor == p && p.parent != h) {
p.predecessor = p.parent;
}
if (parent.left == p) {
parent.left = child;
} else {
parent.right = child;
}
if (child.bitIndex > parent.bitIndex) {
child.parent = parent;
}
}
// Fix H's parent and child Nodes
{
// If H is a parent of its left and right child
// then change them to P
if (h.left.parent == h) {
h.left.parent = p;
}
if (h.right.parent == h) {
h.right.parent = p;
}
// Change H's parent
if (h.parent.left == h) {
h.parent.left = p;
} else {
h.parent.right = p;
}
}
// Copy the remaining fields from H to P
//p.bitIndex = h.bitIndex;
p.parent = h.parent;
p.left = h.left;
p.right = h.right;
// Make sure that if h was pointing to any uplinks,
// p now points to them.
if (isValidUplink(p.left, p)) {
p.left.predecessor = p;
}
if (isValidUplink(p.right, p)) {
p.right.predecessor = p;
}
}