Здравствуйте, я написал этот метод для поиска значений в моем двоичном дереве поиска, но он всегда возвращает 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;
}
Как и проблема, упомянутая в ответе Цезаря Тодиришки, вы присваиваете значения root
, но проверяете subRoot
. Мне кажется, что вы должны проверить переменную, которую вы только что присвоили, то есть использовать subRoot
везде, где вы использовали root
.
Проблема в том, что вы инициализируете subRoot нулем перед циклом while, поэтому, когда вы проверяете условие, оно всегда будет ложным, поэтому переходите к концу функции
Это проблема а, но не единственная проблема.
Конечно. Код войдет в бесконечный цикл, если искомый элемент не будет найден в корне. Есть также проблема неправильного отступа. И дерево потеряет данные после поиска, но оно войдет в бесконечный цикл, так что вы не заметите этой проблемы.
Как я могу это исправить?
Не имея большего ввода, это все, что я могу сделать. Вы забыли присвоить 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;
}
Пройдитесь по коду с помощью отладчика.