我使用了一个调用递归辅助方法的remove方法。通过我教授的测试人员运行时,它表示在删除具有完整3级树的根时,root返回了错误的地址,然后在尝试删除其余的右子树时发生异常。在我自己测试这个场景并没有产生相同的结果。
find(x)返回包含x的节点,addToPool将删除的节点添加到节点池以供以后使用,并且在调用remove之前tempRemove为false。并且min返回包含给定子树的最小值的节点。据我所知,这些应该可以正常工作。
当删除具有两个子节点的节点时,我们被告知用包含其右子树的最小值的节点替换该节点。
public boolean remove(T x) {
if (find(x) == null) {
return false;
}
root = delete(x, root);
if (find(x) == null) {
return true;
} else
return false;
}
private BinaryNode delete(T x, BinaryNode curRoot) {
if (curRoot == null) {
return null;
}
int cmp = x.compareTo(curRoot.element);
if (cmp < 0) {
curRoot.left = delete(x, curRoot.left);
}
else if (cmp > 0) {
curRoot.right = delete(x, curRoot.right);
}
else {
if (curRoot.left == null && curRoot.right == null) // No children
{
if (!tempRemove) {
addToPool(curRoot);
}
return null;
}
else if (curRoot.left != null && curRoot.right == null) // Left
// child
{
BinaryNode curLeft = curRoot.left;
addToPool(curRoot);
return curLeft;
}
else if (curRoot.left == null && curRoot.right != null) // Right
// child
{
BinaryNode curRight = curRoot.right;
if (!tempRemove) {
addToPool(curRoot);
}
return curRight;
}
else // Two children
{
BinaryNode curLeft = curRoot.left;
BinaryNode curRight = curRoot.right;
BinaryNode temp = min(curRoot.right, curRoot.right);
tempRemove = true;
remove(temp.element);
tempRemove = false;
addToPool(curRoot);
curRoot = temp;
curRoot.left = curLeft;
if (curRoot.element != curRight.element)
curRoot.right = curRight;
}
}
return curRoot;
}