private bool Remove()

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;
			}
		}