我有一个像这样的树状结构:
10
/ \
5 12
/ \ / \
3 7 11 18
大于右边的元素的值,右边的元素,左边的小值。 现在我想添加一个“删除”功能,但我不知道怎么回事。 例如,当我删除5时,它应该如下所示:
10
/ \
3 12
\ / \
7 11 18
来自被移除元素(5)的较小链接元素(3)应该与被移除元素链接的元素链接。 这是我的删除功能:
public TElement RootElement;
public void Remove(int value)
{
if (RootElement == null)
{
throw new Exception("Can't delete nothing!");
}
if (RootElement._left == null && RootElement._right == null)
{
RootElement = null;
return;
}
RootElement = RootElement.RemoveElement(value, RootElement);
}
public TElement RemoveElement(int value, TElement current)
{
if (value != _value)
{
if (value < _value)
{
_left.RemoveElement(value, current);
}
if (value > _value)
{
_right.RemoveElement(value, current);
}
}
if (value == _value)
{
if (_value < current._value)
{
if (_left == null && _right == null)
{
}
else
{
current._left = _left;
_left._right = _right;
}
}
if (_value > current._value)
{
if (_left == null && _right == null)
{
}
else
{
current._right = _right;
_right._left = _left;
}
}
}
current = this;
return current;
}
_left
是指向较小元素的指针,_right
指向较大的元素。
如果您需要更多代码,请询问。
答案 0 :(得分:0)
我的解决方案:
public TElement RemoveElement(int value, TElement current)
{
if (value != _value)
{
if (value < _value)
{
current = this;
_left.RemoveElement(value, current);
}
if (value > _value)
{
current = this;
_right.RemoveElement(value, current);
}
}
if (value == _value)
{
if (_value < current._value)
{
if (_left == null && _right == null)
{
current._left = null;
}
else
{
current._left = _left;
_left._right = _right;
}
}
if (_value > current._value)
{
if (_left == null && _right == null)
{
current._right = null;
}
else
{
current._right = _right;
_right._left = _left;
}
}
}
return current;
}