Вы игнорируете возвращаемое значение из рекурсивного вызова и в конечном итоге возвращает 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 равно нулю.