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 に答える