У меня есть это назначение для BST, где я должен найти ближайший узел к данному. Очевидно, что если узел находится в дереве, он будет возвращен. В противном случае узел, который должен быть возвращен, является тем, который ближе всего к дереву (он может быть с обеих сторон).Функция Java продолжается после утверждения возврата
Скрипт отлично работает, за исключением ситуации, когда узел присутствует. Вместо того, чтобы возвращать узел, функция продолжает двигаться и выплевывает другой узел вместо того, чтобы убивать функцию. Мне было интересно, сможет ли кто-нибудь помочь мне.
Дерево структурирована так:
- Он состоит из узлов
- Каждый узел имеет «запись» (строка значения), «право» и «слева»
Вот что у меня есть, спасибо!
public Entry getClosestEntry(String w) {
if (root == null) return null;
else if (root.left == null && root.right == null) return root.entry;
else return getClosestEntry(w, root, null, null, null);
}
private Entry getClosestEntry(String w, Node baseNode, Node highestLow, Node lowestHi, Node finalClosest) {
System.out.println("Dict: " + this);
System.out.println("Top string to compare: " + w);
System.out.println("Top baseNode: " + baseNode.entry.word);
if (w.compareTo(baseNode.entry.word) == 0) {
System.out.println("Top finalClosest is baseNode: " + baseNode.entry.word);
finalClosest = baseNode;
} else {
if (highestLow != null) System.out.println("Top highestLow: " + highestLow.entry.word);
else System.out.println("Top highestLow is null");
if (lowestHi != null) System.out.println("Top lowestHi: " + lowestHi.entry.word);
else System.out.println("Top lowestHi is null");
if (finalClosest != null) System.out.println("Top finalClosest: " + finalClosest.entry.word);
else System.out.println("Top finalClosest is null");
int cmp = w.compareTo(baseNode.entry.word);
if (cmp < 0) {
System.out.println("Word is less than base.");
if (lowestHi == null) {
lowestHi = baseNode;
System.out.println("lowestHi set to: " + lowestHi.entry.word);
}
else {
if (w.compareTo(lowestHi.entry.word) < 0 && baseNode.entry.word.compareTo(lowestHi.entry.word) < 0) {
lowestHi = baseNode;
System.out.println("lowestHi changed to: " + lowestHi.entry.word);
}
}
System.out.println("Returning right side of base.");
if (baseNode.right != null) getClosestEntry(w, baseNode.right, highestLow, lowestHi, finalClosest);
} else {
System.out.println("Word is greater than base.");
if (highestLow == null) {
highestLow = baseNode;
System.out.println("highestLow set to: " + highestLow.entry.word);
}
else {
if (w.compareTo(highestLow.entry.word) > 0 && baseNode.entry.word.compareTo(highestLow.entry.word) > 0) {
highestLow = baseNode;
System.out.println("highestLow changed to: " + highestLow.entry.word);
}
}
System.out.println("Returning left side of base.");
if (baseNode.left != null) getClosestEntry(w, baseNode.left, highestLow, lowestHi, finalClosest);
}
if (lowestHi == null && highestLow != null && finalClosest == null) {
System.out.println("lowestHi is null, so finalClosest must be highestLow.");
finalClosest = highestLow;
} else if (highestLow == null && lowestHi != null && finalClosest == null) {
System.out.println("highestLow is null, so finalClosest must be lowestHi.");
finalClosest = lowestHi;
} else if (lowestHi == null && highestLow == null && finalClosest == null) {
System.out.println("Both sides are null, so node must be null.");
return null;
} else {
System.out.println("Both sides are there. Default to highestLow if finalClosest is null");
if (finalClosest == null) finalClosest = highestLow;
}
}
System.out.println("Final Closest: " + finalClosest.entry.word);
return finalClosest.entry;
}
'if (...) return getClosestEntry (...);', а не 'if (...) getClosestEntry (...);' – Dukeling
@ Dukeling Я был на той дороге ... то же самое. –
@ClaytonAndrewCohn В этом случае строка может быть удалена, так как результат не используется нигде. например, 'if (baseNode.left! = null) getClosestEntry (w, baseNode.left, maximumLow, lowerHi, finalClosest);' будет просто мертвым кодом, так как результатом является 'return finalClosest.entry;' и рекурсивный вызов не мутирует любые значения. – Sylwester