从树数据结构中删除元素

时间:2013-03-28 10:05:43

标签: c# data-structures tree

我有一个像这样的树状结构:

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

1 个答案:

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