我正在尝试为二进制搜索树实现remove方法。除remove方法外,程序大部分已完成。我觉得我的remove方法是完整的,并且从逻辑上讲对我来说没有任何错误,直到运行JUnit测试为止。我的节点包含字符串作为数据。
当我测试下面的代码时,如果删除第一个添加的节点(看起来正确),则返回true,但是当我尝试再次删除它时,即使该节点仍在该节点中,它仍然返回true,即使我的方法应该对其进行了设置为空。我的JUnit代码和方法如下。代码中没有其他方法可以解决任何问题。谁能确定我的方法需要解决的问题?
public boolean remove(String s) {
return remove(root , s);
}
public boolean remove(Node root, String s) {
Node parent = root;
if(root == null) {
return false;
}
if(root.data == s) {
if(root.left == null && root.right == null && getHeight(root) == 1) {//if only node
root = null;
parent = null;
return true;
}
if(root.left == null && root.right == null && getHeight(root) > 1) { //if leaf(no children)
if(parent.right == root) {
parent.right = null;
return true;
}
if(parent.left == root) {
parent.left = null;
return true;
}
}
if(root.left != null && root.right != null && getHeight(root) > 1) { //if node with two children
Node temp = root;
while(temp.right != null) { //find biggest node in left subtree and replace root with that
temp = root.right;
}
root = temp;
return true;
}
if(root.left == null && root.right != null) { //if node with right child only
parent.left = root.right;
return true;
}
if(root.left != null && root.right == null) { //if node with left child only
parent.left = root.left;
return true;
}
}
if(root.data != s){
if(root.data.compareTo(s) < 0) {
parent = root;
remove(root.left, s);
}
if(root.data.compareTo(s) > 0) {
parent = root;
remove(root.right, s);
}
}
return false;
}
JUNIT测试失败的地方:
BinarySearchTree bst = new BinarySearchTree();
assertFalse(bst.remove("abc"));
bst.add("abc");
assertFalse(bst.remove("cba"));
assertTrue(bst.remove("abc"));
assertFalse(bst.remove("abc"));
上面的代码一直工作到最后一个删除调用。