从二进制搜索树中删除元素

时间:2016-01-07 18:15:16

标签: java binary-search-tree

我正在做一项任务,实现自己的二进制搜索树。问题是,我们有自己的Node实现,它的父代不能直接访问。

我已经搜索了答案,但我不想完全复制解决方案,但我似乎仍然没有把它弄好。我遗漏了一些没有删除元素的情况。

你能帮助我帮我做错了吗?

这是删除方法:

void remove(E elem) {
    if(elem != null){
        if (root != null && contains(elem)) {  
            removeFromSubtree(elem, root, null);  
        }
    }
}

void removeFromSubtree(E elem, Node<E> current, Node<E> parent) {

    if(elem.less(current.contents)){
        if(current.left == null) return ;
        removeFromSubtree(elem, current.left, current);
    } else if(elem.greater(current.contents)){
        if(current.right == null)return;
        removeFromSubtree(elem, current.right, current);
    } else {
        if(current.left != null && current.right != null){
            //both children
            if(parent == null){
                Node<E> n = new Node<>(null, null);
                n.left = root;
                removeFromSubtree(root.contents, n, null);
                root = n.left;
                root.setParent(null);
            }
            E min = subtreeMin(current.right);
            current.contents = min;
            removeFromSubtree(min, current.right, current);
        } else if(current.left != null){
            //left child
            if (parent == null) {
                    root = current.left;
                    current.left.setParent(null);
                    return ;
                }
            setParentChild(current, parent, current.left);
        } else if(current.right != null){
            //right child
            if (parent == null) {
                root = current.right;
                current.right.setParent(null);
                return ;
            }
            setParentChild(current, parent, current.right);
        } else {
            if (parent == null) {
                root = null;
                return ;
            }
            setParentChild(current, parent, null);
        }
    }
}

节点使用通用接口

class Node<E extends DSAComparable<E>>

它只是比较的方法。看起来像这样

interface DSAComparable<E extends DSAComparable<E>> {
    boolean less(E other); 
    boolean greater(E other);
    boolean equal(E other);
}

我使用另一个删除内部的方法来设置节点的父节点的子节点,具体取决于它的左子节点还是右子节点。

void setParentChild(Node<E> node, Node<E> parent,Node<E> value){
    if(parent!= null){
        if (parent.left == node) {
            parent.left = value;
        } else {
            parent.right = value;
        }
        if(value!= null) value.setParent(parent);
    }
}

方法subtreeMin(Node node)找到子树中最小的值(最左边的一个)

1 个答案:

答案 0 :(得分:0)

了解您的代码并不容易,因为它仍然缺乏细节。

我会参考您可以在线找到的二进制搜索树的实现。

例如,参见Algorithms, 4th Ed.中的那个。