Nas*_*ail 6 java algorithm reference binary-search-tree
我正在尝试编写一种从二进制搜索树中删除节点的方法.这是我删除节点的方法.
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()));
}
}
Run Code Online (Sandbox Code Playgroud)
我在叶子节点上检查了这个方法,但是在调试之后我发现执行的nodeToBeSelected=null发生,实际上没有删除节点.因为我仍然可以搜索已删除的值,程序仍然设法获取它.
tree.add(5);
tree.delete(5);
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted
Run Code Online (Sandbox Code Playgroud)
这是我的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;
}
Run Code Online (Sandbox Code Playgroud)
getNode()方法是否按值返回找到的节点?如何使其返回引用并直接操作找到的节点?
当您nodeToBeDeleted = null;在delete方法内部说时,您并没有真正导致方法Node返回的getNode开始指向 a null。
Java 始终是pass-by-value. 这意味着您不能使传递给方法的引用指向该方法内的新内存位置。同样,您不能将方法调用返回的引用指向另一个方法内的新内存位置。(即使位置是,嗯.. 一个空值)。
根据上面的解释,几乎不可能使用该getNode方法获取Node您不想删除的 ,然后null在其他方法中使该节点指向 a 。一个快速的解决方案是在getNode方法内复制方法中的代码delete。您应该添加一个setLeftChildandsetRightChild方法Node(而不是像其他人建议的那样将 leftChild 和 rightChild 公开)。然后,您可以将其设置为 null,如下所示:
nodeToBeDeleted.setLeftChild(null)
您必须从树中删除节点,而不是在程序中本地删除.
Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
Run Code Online (Sandbox Code Playgroud)
为您提供树中节点的副本.
nodeToBeDeleted = null;
Run Code Online (Sandbox Code Playgroud)
将此副本设置为null.不会删除与树的连接,因为它是节点对象的一部分.要删除连接,您必须编写另一种删除节点的方法,这应该包含类似的内容
parent.leftNode = null; // if nodeToBeDeleted == leftNode
parent.rightNode = null; // if nodeToBeDeleted == rightNode
Run Code Online (Sandbox Code Playgroud)