0

我有一个这样的树结构:

    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指向较大元素。如果您需要更多代码,请询问。

4

1 回答 1

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;
        }
于 2013-03-28T14:43:31.873 回答