BST的删除功能不会从BST中删除任何元素

时间:2019-04-10 02:32:56

标签: java binary-search-tree

我有一种方法应该从二进制搜索树中删除给定的元素。但是,当我运行程序时,它实际上并没有从BST中删除任何元素。

我了解此功能的工作原理:将具有给定元素的节点的根设置为其他根,但是我几乎可以肯定我的方法是不正确的。我尝试仅将给定元素的节点设置为null,但这也没有删除任何内容。

public boolean remove(int removalPoint) {

    int maxData = 0;

    if (root == null)

        return false;

    if (removalPoint == root.getData()) {

        if (getRightSubtree().root == null && getLeftSubtree().root == null)

            root = null;

        if (getRightSubtree().root != null && getLeftSubtree().root == null) {

            root = getRightSubtree().root;

            getRightSubtree().root = null;

            return false;
        }

        if (getLeftSubtree().root != null && getRightSubtree().root == null) {

            root = getLeftSubtree().root;

            getLeftSubtree().root = null;

            return false; 

        }

        if (getLeftSubtree().root != null && getRightSubtree().root != null) {

            maxData = getLeftSubtree().deleteMax();

            root.setData(maxData);

            return false;

        }

        if (removalPoint < root.getData())

            getLeftSubtree().remove(removalPoint);

        if (removalPoint > root.getData())

            getRightSubtree().remove(removalPoint);

    }

    return true;

}

public int deleteMax() {

    int maxData = 0;

    BSTNode RT = getRightSubtree().root;

    if (RT == null) {

        maxData = root.getData();

        root = getLeftSubtree().root;

    }

    else
        return getRightSubtree().deleteMax();

    return maxData;

}

我的测试用例在主函数中的输出如下所示:

Remove 30, rc=false
        20
    19
        16
12
            9
        8
    6
            5
        4

Remove 20, rc=true
    19
        16
12
            9
        8
    6
            5
        4

Remove 4, rc=true
    19
        16
12
            9
        8
    6
        5

Remove 19, rc=true
    16
12
            9
        8
    6
        5

2 个答案:

答案 0 :(得分:0)

首先,您检查root是否具有要从树中删除的数据。

如果root没有您要删除的值怎么办?

此外,作为一般说明,从树中删除是通过递归最优雅地完成的(尽管您的方法也可以使用)。这是递归完成的节点删除的一种实现: https://www.geeksforgeeks.org/binary-search-tree-set-2-delete/

答案 1 :(得分:0)

尤里卡!。事实证明,正是我对getRightSubtree()的使用(反之亦然)导致了问题,我应该只使用getRight和getLeft函数。从我收集到的信息来看,当我在为if语句等使用Subtree方法时,该程序仅检查Subtree的根,而不检查整个BST的其他节点。还鼓励我更改deleteMax函数,以便它返回一个BSTNode而不是一个Integer,这显然使最后一种情况更容易找出。这是我更新的代码:

`public boolean remove(int removalPoint){

    if (this.searchRecursion(removalPoint) == null)

        return false;

    if (removalPoint < root.getData())

        root.getLeft().remove(removalPoint);

    if (removalPoint > root.getData())

        root.getRight().remove(removalPoint);

    if (root.data == removalPoint) {

        if (root.getRight().root == null && root.getLeft().root == null) {

            root = null;

            return true;
        }

        if (root.getRight().root == null && root.getLeft().root != null) {

            root = root.getRight().root;

            return true;

        }

        if (root.getLeft().root != null && root.getRight().root == null) {

            root = root.getLeft().root;

            return true;
        }

    }

    if (root.getLeft().root != null && root.getRight().root != null) {
        root.setData(root.getLeft().deleteMax().getData());

        return true;

    }

    return false;

}

public BSTNode deleteMax() {

    BSTNode maxData;

    if (root.getRight().root == null) {

        maxData = root;

        root = root.getLeft().root;

        return maxData;

    }

    return root.getRight().deleteMax();

}`