Java метод не завершается должным образом с оператором return - PullRequest
0 голосов
/ 19 июня 2020

Я начинаю писать функцию для двоичного дерева. В настоящее время метод стремится найти узел в дереве и вернуть узел. Значение root - это данные, а левое и правое - поддеревья. Когда я прохожу через него в отладчике, когда он доходит до оператора return, он переходит обратно во второй блок if и в конечном итоге возвращает null.

@Override
public T successor(T d) {



T datas = null;

    if (d.compareTo(this.data) < 0) //If its less than the root
        left.successor(d);

    if (d.compareTo(this.data) > 0) //If its less than the root
        right.successor(d);


    if (d.equals(this.data)){ //We found the node
        datas = this.data;
    }

    return datas;
}

1 Ответ

2 голосов
/ 19 июня 2020

Вы игнорируете возвращаемое значение из рекурсивного вызова и в конечном итоге возвращает null (данные) в определенной точке стека вызовов.

Измените код как:

T datas = null;

if (d.compareTo(this.data) < 0) //If its less than the root
    datas = left.successor(d);

if (d.compareTo(this.data) > 0) //If its less than the root
    datas = right.successor(d);


if (d.equals(this.data)){ //We found the node
    datas = this.data;
}

return datas;

Или вы можете удалить локальную переменную и упростить ее как

if (d.compareTo(this.data) < 0) {
    return left.successor(d);
} else if (d.compareTo(this.data) > 0) {
    return right.successor(d);
} 
return this.data;

UPDATE: предполагается, что искомое значение существует. Вы должны быть осторожны, когда left / right равно нулю.

...