如何在BST中测试我的删除方法

时间:2015-03-31 22:25:21

标签: java search methods tree binary-search-tree

所以在我的二叉搜索树中,我正在尝试测试我的删除方法,看它是否从BST中删除了一个节点。问题是我的测试一直说它不起作用。 这是我如何测试我的删除方法

message = "Test 3: deleting 'word' -- ";
t = new BSTRefBased();
try {
    t.delete("word");
    result = t.getRootItem().getWord().equals(null);
} catch (Exception e) {
    result = false;
}
System.out.println(message + (result ? "passed" : "failed"));

这是我的删除方法:

   public void delete(String word) {
        root = deleteItem(root, word);
    }


    protected TreeNode deleteItem(TreeNode r, String word) {
        if (r == null){
            return r;
        }
        if(word.compareTo(r.item.getWord()) < 0){
            return r;
        } else if (word.compareTo(r.item.getWord()) > 0) {
            return r;
        } else if(r.left != null && r.right != null)
        {
            return deleteItem(r, word);
        } else {
            return r;
        }
    return r;
}

那为什么它一直说我的删除方法在我的输出中失败了?我的测试代码或实际方法有问题吗?我之前也在BST中插入了“word”这个词,所以它应该在那里。 这是我想要删除方法的伪代码版本:

delete(treeNode ,searchitem)
targetNode = search(treeNode ,searchItem)
if targetNode is null
return

P = parent node of target Node

if targetNode has no children
update ref in P that leads to targetNode
return

if targetNode has only one child C update ref in P that leads 
to targetNode by overwriting that ref with C 
(either left- or right-ref in P)
return

M = targetNode's inorder successor (i.e., left-most in-order 
successor in targetNode's right subtree)
m = item in M
copy m into targetNode's item field 
delete (treeNode, M)
return 

2 个答案:

答案 0 :(得分:1)

假设您的BST代码编写正确,请向我解释您实际上是如何删除节点的?当我查看你的代码时,你对deleteItem(root,word)的调用完全没有做任何事情。无论发生什么,它都会返回root,然后将其应用于root。

答案 1 :(得分:0)

deleteItem()方法永远不会从树中删除节点。这就是它失败的原因。

检查this answerWikipedia article on Binary Search Trees,以便更好地了解应如何删除。