метод removeAll для BST (дерево двоичного поиска) - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть этот код ниже, я пытаюсь создать метод removeAll для Двоичного дерева поиска.Я думаю, что приведенный ниже код, скорее всего, читабелен даже без внешнего кода и контекста, но если нет, я буду рад предоставить больше информации.Однако этот код просто не работает, и я не могу выяснить причину этого.Я просто пытаюсь перебрать бинарное дерево поиска, используя обход по порядку, подсчитывая, сколько раз существует targetElement, а затем вызывая метод удаления это количество раз.

public void removeAllOccurrences(T targetElement) throws ElementNotFoundException 
   {
    removeElement(targetElement);

    Comparable<T> comparableElement = (Comparable<T>) targetElement;
    Iterator<T> iter = iteratorInOrder();
    int n = 0; 


    while(iter.hasNext())
    {
        if (((Comparable<T>) comparableElement).equals(iter.next())) 
        {
            n++;
        }
    }

    for(int i=0; i<n; i++)
    {
        removeElement(targetElement);
    }


}

Имякласс LinkedBinarySearchTree.Мы работаем с BinaryTreeNode.У нас есть метод getRootNode ().

1 Ответ

0 голосов
/ 05 декабря 2018

Поскольку вы предполагаете, что T реализует Comparable<T> (путем приведения targetElement), вы должны использовать эту функцию.Метод equals, который вы используете для сравнения comparableElement и iter.next(), является методом, унаследованным от класса Object, и, возможно, не был переопределен T.Реализация по умолчанию метода equals просто сравнивает адреса памяти вызывающей стороны и аргумента, который, вероятно, не тот, который вам нужен.

Метод compareTo Comparable<T> фактически будет реализован T поэтому вы должны использовать его вместо.compareTo возвращает int, который указывает, что вызывающая сторона меньше аргумента, если он отрицательный, вызывающая сторона больше аргумента, если он положительный, или вызывающая сторона равна аргументу, если он равен нулю.Следовательно, вы должны изменить выражение ((Comparable<T>) comparableElement).equals(iter.next()) на comparableElement.compareTo(iter.next()) == 0.Приведение comparableElement не является необходимым, поскольку переменная уже имеет тип Comparable<T>.

Вот как выглядит изменение в вашем коде.

public void removeAllOccurrences(T targetElement) throws ElementNotFoundException {
    removeElement(targetElement);

    Comparable<T> comparableElement = (Comparable<T>) targetElement;
    Iterator<T> iter = iteratorInOrder();
    int n = 0;

    while(iter.hasNext()) {
        if (comparableElement.compareTo(iter.next()) == 0) {
            n++;
        }
    }

    for (int i = 0; i < n; i++) {
        removeElement(targetElement);
    }
}

Дайте мне знать, еслиЯ неправильно понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...