Метод isEmpty для проблемы с бинарным деревом

Я пытаюсь написать метод isEmpty для бинарного дерева, но у меня возникла проблема. Так что это метод, который я использую.

public boolean isEmpty(){
if(root == null) return true;
else return false;
}

Когда я добавляю только один элемент, а затем удаляю этот элемент и вызываю isEmpty, я получаю не true, а false.

Что-то не так с моей реализацией?


Итак, это метод удаления:

  /**
    * Internal method to remove from a subtree.
    * @param x the item to remove.
    * @param t the node that roots the tree.
    * @return the new root.
    * @throws ItemNotFoundException if x is not found.
    */
    protected BinaryNode<AnyType> remove( AnyType x, BinaryNode<AnyType> t )
    {
    if( t == null )
    throw new ItemNotFoundException( x.toString( ) );
    if( x.compareTo( t.element ) < 0 )
    t.left = remove( x, t.left );
    else if( x.compareTo( t.element ) > 0 )
    t.right = remove( x, t.right );
    else if( t.left != null && t.right != null ) // Two children
    {
    t.element = findMin( t.right ).element;
    t.right = removeMin( t.right );
    }
    else
    t = ( t.left != null ) ? t.left : t.right;
    return t;
    }

и это метод removeMin, который использует метод удаления:

        /**
         * Internal method to remove minimum item from a subtree.
         * @param t the node that roots the tree.
         * @return the new root.
         * @throws ItemNotFoundException if t is empty.
         */
         protected BinaryNode<AnyType> removeMin( BinaryNode<AnyType> t )
         {
         if( t == null )
        throw new ItemNotFoundException( );
        else if( t.left != null )
        {
        t.left = removeMin( t.left );
        return t;
        }
        else
        return t.right;
        }

person FranXh    schedule 25.02.2012    source источник
comment
Я думаю, что проблема в функции удаления. Это выглядит нормально.   -  person JProgrammer    schedule 26.02.2012
comment
Метод isEmpty правильный. Было бы здорово, если бы вы показали нам метод remove.   -  person Luiggi Mendoza    schedule 26.02.2012
comment
Это не является причиной вашей проблемы, но вы можете просто return root==null;   -  person Paul    schedule 26.02.2012
comment
Функция удаления работает нормально. Я также протестировал его.   -  person FranXh    schedule 26.02.2012
comment
На самом деле метод должен выглядеть так, хотя это всего лишь хорошая практика: public boolean isEmpty() { return root == null; }   -  person ExtremeCoder    schedule 26.02.2012
comment
Если функция удаления работает нормально, то почему root не равно нулю?   -  person Paul    schedule 26.02.2012
comment
@user1181847 user1181847 Интересно, почему вы возвращаете BinaryNode<AnyType>, когда вы должны удалить его (аннулировать) и вернуть элемент AnyType.   -  person Luiggi Mendoza    schedule 26.02.2012
comment
потому что я храню их как внутренние методы и вызываю их из своих публичных методов   -  person FranXh    schedule 26.02.2012


Ответы (2)


Проверьте код удаления элемента. Обычно код определяет родителя удаляемого узла и устанавливает для соответствующей ссылки нулевое значение. И для последнего элемента необходимо установить нулевую переменную root.

person Sergey Grinev    schedule 25.02.2012

Ваш метод remove(AnyType x, BinaryNode<AnyType> t) ищет узел с элементом X и заменяет его одним из своих дочерних элементов методом removeMin (если у него 2 дочерних элемента) или левым или правым дочерним узлом. Ваш общедоступный метод удаления может быть примерно таким:

public boolean remove(AnyType x) {
    try {
        BinaryNode<AnyType> node = remove(x, root);
        if (node != null) {
            node = null;
            return true;
        }
        return fal
    } catch (Exception e) {
        //do something with the exception
        return false;
    }
}
person Luiggi Mendoza    schedule 25.02.2012
comment
все еще не работает. когда я пытаюсь удалить элемент, введенный первым, isEmpty по-прежнему имеет значение false, что означает, что корень еще не установлен в значение null. - person FranXh; 26.02.2012
comment
Вы сделали некоторую отладку и проверили, что корень и узел имеют одинаковое значение, когда ваше дерево имеет только 1 элемент? - person Luiggi Mendoza; 26.02.2012