Я хочу искать значения в двоичном дереве поиска, используя итерацию

Здравствуйте, я написал этот метод для поиска значений в моем двоичном дереве поиска, но он всегда возвращает false, независимо от того, найдено ли значение в моем bst или нет. может кто-нибудь, пожалуйста, скажите мне, в чем моя ошибка и как я могу это исправить.

    public boolean search(int key) {
    BinaryTreeNode subRoot = null;
          
        while (subRoot != null)  
        {  
             
            if (key > subRoot.getData()) {
                root = subRoot.getRight();  
            }
             
            else if (key < subRoot.getData())  
                root = subRoot.getLeft();  
            else
                System.out.println("Searching for " + key + ": found");
                return true; 
        }  
        System.out.println("Searching for " + key + ": NOT found");
        return false;  
    
}

Пройдитесь по коду с помощью отладчика.

tgdavies 21.03.2022 00:53

Как и проблема, упомянутая в ответе Цезаря Тодиришки, вы присваиваете значения root, но проверяете subRoot. Мне кажется, что вы должны проверить переменную, которую вы только что присвоили, то есть использовать subRoot везде, где вы использовали root.

Dawood ibn Kareem 21.03.2022 01:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что вы инициализируете subRoot нулем перед циклом while, поэтому, когда вы проверяете условие, оно всегда будет ложным, поэтому переходите к концу функции

Это проблема а, но не единственная проблема.

tgdavies 21.03.2022 00:54

Конечно. Код войдет в бесконечный цикл, если искомый элемент не будет найден в корне. Есть также проблема неправильного отступа. И дерево потеряет данные после поиска, но оно войдет в бесконечный цикл, так что вы не заметите этой проблемы.

Erwin Bolwidt 21.03.2022 00:58

Как я могу это исправить?

user16218933 21.03.2022 00:59
Ответ принят как подходящий

Не имея большего ввода, это все, что я могу сделать. Вы забыли присвоить subRoot root в начале. Здесь вы присваиваете значения своему корню в цикле, это приведет к потере данных и, скорее всего, к бесконечному циклу. Кроме того, в вашем операторе else не было скобок, поэтому он всегда возвращал бы true, если бы вы вошли в цикл.

public boolean search(int key) {
BinaryTreeNode subRoot = root;
      
    while (subRoot != null)  
    {  
         
        if (key > subRoot.getData()) 
            subRoot = subRoot.getRight();             
        else if (key < subRoot.getData())  
            subRoot = subRoot.getLeft();  
        else{
            System.out.println("Searching for " + key + ": found");
            return true;
        } 
    }  
    System.out.println("Searching for " + key + ": NOT found");
    return false;  

}

Другие вопросы по теме