Java二进制搜索树错误地删除root?

时间:2017-02-10 20:43:45

标签: java binary-search-tree

我使用了一个调用递归辅助方法的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;
}

0 个答案:

没有答案