我正在尝试编写一个从二叉搜索树中删除节点的方法。以下是我的删除节点方法。
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()));
}
}
我在叶节点上检查了这种方法,虽然经过调试后我发现执行nodeToBeSelected=null
,但该节点实际上并未被删除。因为我仍然可以搜索已删除的值,并且程序仍然能够获取它。
tree.add(5);
tree.delete(5);
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted
这是我的getNode()方法。
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;
}
getNode()方法返回找到的节点的值吗?我该如何使其返回引用并直接操作找到的节点?
leftNode
和rightNode
定义为public
字段。使用 setter 是更好的选择。 - Chetan Kingervoid deleteChild(Node nodeToBeDeleted)
的片段。 - CoronA