从Java中的二进制搜索树中删除节点?

时间:2015-10-08 19:29:27

标签: java binary-search-tree

我已经获得了一个二叉搜索树,作为我负责任务的一部分,我需要在我的set和node类上实现remove()方法。 / p>

现在,我的JUnit测试无法正确删除项目。代码如下:

BSTSet

public boolean remove(E item) {     
    if (this.contains(item)) {
        this.root.remove(item);
        this.count--;
        return true;
    }   

    return false;
}

BSTNode

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;
}

如果可能的话,我更喜欢间接答案。我想尝试自己解决这个问题。任何人都可以提供一些指示,说明这里出了什么问题吗?

1 个答案:

答案 0 :(得分:0)

不会说这是答案,但我无法对我的代表发表评论。发布节点的实现方式会有所帮助。

如果您的树被可视化为数组[10,5,12],那么5,是10的左节点,12是右节点。如果你打电话给.remove(10)。在ReplacementSubtreeFromChildren方法结束时,你会得到一棵看起来像这样的树[12,​​12,12]。因为你将5设置为12,然后将10设置为(5值是什么)12。