У меня есть такая древовидная структура:

    10
   /  \
  5    12
 / \   / \
3   7 11  18

Значения больше, чем элемент перед связыванием справа, меньшие - слева. Теперь я хочу добавить функцию «Удалить», но как-то не понимаю. Например, когда я удаляю 5, это должно выглядеть так:

    10
   /  \
  3    12
   \   / \
    7 11  18

Меньший связанный элемент (3) из удаленного элемента (5) должен быть связан с элементом, с которым был связан удаленный элемент. Вот моя функция удаления:

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
Tim Kathete Stadler 28 Мар 2013 в 14:05
Эта операция требует обновления родителя какого-то элемента, но в этом коде я его не вижу. Более того, почему функция Remove не недействительна. почему он возвращает значение?
 – 
Hossein Narimani Rad
28 Мар 2013 в 14:12
Думаю, это current.
 – 
Tim Kathete Stadler
28 Мар 2013 в 14:13

1 ответ

Лучший ответ

Мое решение:

 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;
        }
0
Tim Kathete Stadler 28 Мар 2013 в 18:43