Sto provando a scrivere un metodo per eliminare un nodo da un albero di ricerca binario. Ecco il mio metodo per eliminare un nodo.Java: l'impostazione dell'oggetto su null all'interno di un metodo non ha alcun effetto (riutilizzo del codice)
public void delete(int deletionNodeValue) {
Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
if(nodeToBeDeleted == null) return; // No node with such value exists throw an error
if(isLeafNode(nodeToBeDeleted)) {
nodeToBeDeleted = null;
} else if (nodeToBeDeleted.getNumChildren() == 1) {
bypassNode(nodeToBeDeleted);
}else {
replace(nodeToBeDeleted, getSuccessor(nodeToBeDeleted.getValue()));
}
}
ho controllato questo metodo su un nodo foglia, anche se dopo il debug ho scoperto che l'esecuzione di nodeToBeSelected=null
avviene, il nodo non viene effettivamente cancellato. Come posso ancora cercare il valore cancellato e il programma riesce ancora a recuperarlo.
tree.add(5);
tree.delete(5);
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted
Ecco il mio getNode metodo()
public Node<Integer> getNode(int searchValue) {
Node<Integer> currentNode = root;
while(currentNode != null) {
int currentNodeValue = currentNode.getValue();
if(searchValue == currentNodeValue)
return currentNode;
else if(searchValue < currentNodeValue)
currentNode = currentNode.getLeftChild();
else
currentNode = currentNode.getRightChild();
}
// if no node with given value is found
return null;
}
è il metodo getNode() restituendo il nodo trovato per valore? Come posso renderlo di riferimento e manipolare direttamente il nodo trovato?
@NashVali Non credo che si dovrebbe essere definendo 'leftNode' e' 'rightNode' come campi public' .L'utilizzo di setter è un'opzione migliore. – CKing
Sì, non dovrebbero essere pubblici. Questo codice è uno snippet di un metodo fittizio 'void deleteChild (Node nodeToBeDeleted)'. – CoronA
Il metodo fittizio può ancora utilizzare setter fittizi invece di utilizzare campi pubblici fittizi. Vedi la mia risposta. – CKing