繁体   English   中英

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

[英]Removing a node from a binary search tree in Java?

我已经得到了一个二进制搜索树,作为任务的一部分,我需要在set和node类上都实现remove()方法。

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

BSTSet

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

    return false;
}

BST节点

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

如果可能,我希望使用间接答案。 我想尝试自己解决这个问题。 任何人都可以提供一些有关这里出了什么问题的指示吗?

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

如果您的树被可视化为数组[10,5,12],使得5是10的左节点,而12是右节点。 如果您调用.remove(10)。 在ReplacementSubtreeFromChildren方法的最后,您将有一棵看起来像这样的树[12,12,12]。 因为您将5设置为12,然后将10设置为(5的值)12。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM