in csharp/src/Containers/AvlTree.cs [528:644]
private bool Remove(Int32 node, TKey key, ref Int32 removedParent)
{
while (true)
{
Int32 compare = key.CompareTo(_data[node].Key);
if (compare == 0)
{
Int32 parent = _data[node]._parent;
if (_data[node]._left == _NO_ELEMENT)
{
if (parent == _NO_ELEMENT)
{
_root = _data[node]._right;
_data[node]._parent = _NO_ELEMENT;
if (_root != _NO_ELEMENT)
_data[_root]._parent = _NO_ELEMENT;
}
else if (_data[parent]._left == node)
{
_data[parent]._left = _data[node]._right;
if (_data[node]._right != _NO_ELEMENT)
_data[_data[node]._right]._parent = parent;
}
else
{
_data[parent]._right = _data[node]._right;
if (_data[node]._right != _NO_ELEMENT)
_data[_data[node]._right]._parent = parent;
}
_data[node]._right = _free;
int removed = _data[node]._parent;
_data[node]._parent = _data[node]._left = _NO_ELEMENT;
_free = node;
removedParent = removed;
return true;
}
else if (_data[node]._right == _NO_ELEMENT)
{
if (parent == _NO_ELEMENT)
{
_root = _data[node]._left;
_data[node]._parent = _NO_ELEMENT;
if (_root != _NO_ELEMENT)
_data[_root]._parent = _NO_ELEMENT;
}
else if (_data[parent]._left == node)
{
_data[parent]._left = _data[node]._left;
if (_data[node]._left != _NO_ELEMENT)
_data[_data[node]._left]._parent = parent;
}
else
{
_data[parent]._right = _data[node]._left;
if (_data[node]._left != _NO_ELEMENT)
_data[_data[node]._left]._parent = parent;
}
_data[node]._right = _free;
int removed = _data[node]._parent;
_data[node]._parent = _data[node]._left = _NO_ELEMENT;
_free = node;
removedParent = removed;
return true;
}
else
{
Int32 temp = _data[node]._left;
while (_data[temp]._right != _NO_ELEMENT)
temp = _data[temp]._right;
_data[node].Value = _data[temp].Value;
_data[node].Key = _data[temp].Key;
_data[temp].Key = key;
_data[temp].Value = default(TValue);
//parent = node;
node = _data[node]._left;
continue;
}
}
else if (compare < 0)
{
if (_data[node]._left != _NO_ELEMENT)
{
//parent = node;
node = _data[node]._left;
continue;
}
}
else
{
if (_data[node]._right != _NO_ELEMENT)
{
//parent = node;
node = _data[node]._right;
continue;
}
}
removedParent = _NO_ELEMENT;
return false;
}
}