in java/src/main/java/com/epam/deltix/containers/AvlTree.java [250:392]
private void remove(AvlTreeNode<TKey, TValue> node, TKey keyToRemove, AvlTreeNode<TKey, TValue> parent)
{
if (keyToRemove.compareTo(node.key) == 0)
{
if (node.left == null)
{
if (parent == null)
{
if(node.right != null) prev[node.right.index] = -1;
root = node.right;
}
else if (parent.left == node)
{
if(node.right != null && prev[node.right.index] == node.index)
{
prev[node.right.index] = prev[node.index];
if(prev[node.index] != -1)
next[prev[node.index]] = node.right.index;
}
if (prev[parent.index] == node.index)
{
prev[parent.index] = prev[node.index];
if(prev[node.index] != -1)
next[prev[node.index]] = parent.index;
}
parent.left = node.right;
}
else
{
if(node.right != null && prev[node.right.index] == node.index)
{
prev[node.right.index] = prev[node.index];
if(prev[node.index] != -1)
next[prev[node.index]] = node.right.index;
}
if (next[parent.index] == node.index)
{
next[parent.index] = next[node.index];
if(next[node.index] != -1)
prev[next[node.index]] = parent.index;
}
parent.right = node.right;
}
next[node.index] = -1;
prev[node.index] = -1;
values.set(node.index, null);
keys.set(node.index, null);
freeIndexes[++freeIndexesHead] = node.index;
avlTreeNodeAPMemoryManager.delete(node);
}
else if (node.right == null)
{
if (parent == null)
{
next[node.left.index] = next[root.index];
root = node.left;
}
else if (parent.left == node)
{
if(next[node.left.index] == node.index)
{
next[node.left.index] = next[node.index];
if(next[node.left.index] != -1)
prev[next[node.left.index]] = node.left.index;
}
if (prev[parent.index] == node.index)
{
prev[parent.index] = prev[node.index];
if(prev[node.index] != -1)
next[prev[node.index]] = parent.index;
}
parent.left = node.left;
}
else
{
if(next[node.left.index] == node.index)
{
next[node.left.index] = next[node.index];
if(next[node.left.index] != -1)
prev[next[node.left.index]] = node.left.index;
}
if (next[parent.index] == node.index)
{
next[parent.index] = next[node.index];
if(next[node.index] != -1)
prev[next[node.index]] = parent.index;
}
parent.right = node.left;
}
next[node.index] = -1;
prev[node.index] = -1;
values.set(node.index, null);
keys.set(node.index, null);
freeIndexes[++freeIndexesHead] = node.index;
avlTreeNodeAPMemoryManager.delete(node);
}
else
{
AvlTreeNode<TKey, TValue> tempNode = node.left;
while (tempNode.right != null)
tempNode = tempNode.right;
node.value = tempNode.value;
node.key = tempNode.key;
keys.set(node.index, node.key);
values.set(node.index, node.value);
tempNode.key = keyToRemove;
remove(node.left, keyToRemove, node);
rightFix(node, parent);
}
}
else if (keyToRemove.compareTo(node.key) < 0)
{
if (node.left != null)
{
remove(node.left, keyToRemove, node);
rightFix(node, parent);
}
}
else
{
if (node.right != null)
{
remove(node.right, keyToRemove, node);
leftFix(node, parent);
}
}
}