我已经获得了一个二叉搜索树,作为我负责任务的一部分,我需要在我的set和node类上实现remove()
方法。 / p>
现在,我的JUnit测试无法正确删除项目。代码如下:
public boolean remove(E item) {
if (this.contains(item)) {
this.root.remove(item);
this.count--;
return true;
}
return false;
}
public BSTNode<E>remove(E item) {
if (item.equals(this.value)) {
return this.replacementSubtreeFromChildren(this.left, this.right);
}
if (item.compareTo(this.value) < 0) {
this.left = this.left.remove(item);
} else {
this.right = this.right.remove(item);
}
// there was no need to replace the receiver node
return this;
}
其中replacementSubtreeFromChildren
是:
private BSTNode<E> replacementSubtreeFromChildren(BSTNode<E> left, BSTNode<E> right) {
if (left == null && right == null) {
return null;
}
if (left != null && right == null) {
return left;
}
if (right != null && left == null) {
return right;
}
this.getLeftmostNode().value = this.right.getLeftmostNode().value;
this.value = this.getLeftmostNode().value;
return this;
}
如果可能的话,我更喜欢间接答案。我想尝试自己解决这个问题。任何人都可以提供一些指示,说明这里出了什么问题吗?
答案 0 :(得分:0)
不会说这是答案,但我无法对我的代表发表评论。发布节点的实现方式会有所帮助。
如果您的树被可视化为数组[10,5,12],那么5,是10的左节点,12是右节点。如果你打电话给.remove(10)。在ReplacementSubtreeFromChildren方法结束时,你会得到一棵看起来像这样的树[12,12,12]。因为你将5设置为12,然后将10设置为(5值是什么)12。