我正在尝试在我的Binary Search Tree程序中实现remove方法

时间:2019-04-25 22:03:05

标签: java data-structures binary-search-tree

我正在尝试为二进制搜索树实现remove方法。除remove方法外,程序大部分已完成。我觉得我的remove方法是完整的,并且从逻辑上讲对我来说没有任何错误,直到运行JUnit测试为止。我的节点包含字符串作为数据。

当我测试下面的代码时,如果删除第一个添加的节点(看起来正确),则返回true,但是当我尝试再次删除它时,即使该节点仍在该节点中,它仍然返回true,即使我的方法应该对其进行了设置为空。我的JUnit代码和方法如下。代码中没有其他方法可以解决任何问题。谁能确定我的方法需要解决的问题?

public boolean remove(String s) {
        return remove(root , s);
    }


    public boolean remove(Node root, String s) {
        Node parent = root;
        if(root == null) {
            return false;
        }
        if(root.data == s) {
            if(root.left == null && root.right == null && getHeight(root) == 1) {//if only node
                root = null;
                parent = null;
                return true;
            }
            if(root.left == null && root.right == null && getHeight(root) > 1) { //if leaf(no children)
                if(parent.right == root) {
                    parent.right = null;
                    return true;
                }
                if(parent.left == root) {
                    parent.left = null;
                    return true;
                }
            }
            if(root.left != null && root.right != null && getHeight(root) > 1) { //if node with two children
                Node temp = root;
                while(temp.right != null) { //find biggest node in left subtree and replace root with that
                    temp = root.right;
                }
                root = temp;
                return true;
            }
            if(root.left == null && root.right != null) { //if node with right child only
                parent.left = root.right;
                return true;
            }
            if(root.left != null && root.right == null) { //if node with left child only
                parent.left = root.left;
                return true;
            }
        }
        if(root.data != s){
            if(root.data.compareTo(s) < 0) {
                parent = root;
                remove(root.left, s);
            }
            if(root.data.compareTo(s) > 0) {
                parent = root;
                remove(root.right, s);
            }
        }
        return false;
    }

JUNIT测试失败的地方:

BinarySearchTree bst = new BinarySearchTree();

        assertFalse(bst.remove("abc"));


        bst.add("abc");
        assertFalse(bst.remove("cba"));
        assertTrue(bst.remove("abc"));

        assertFalse(bst.remove("abc"));

上面的代码一直工作到最后一个删除调用。

0 个答案:

没有答案