所以在我的二叉搜索树中,我正在尝试测试我的删除方法,看它是否从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
答案 0 :(得分:1)
假设您的BST代码编写正确,请向我解释您实际上是如何删除节点的?当我查看你的代码时,你对deleteItem(root,word)的调用完全没有做任何事情。无论发生什么,它都会返回root,然后将其应用于root。
答案 1 :(得分:0)
您deleteItem()
方法永远不会从树中删除节点。这就是它失败的原因。
检查this answer和Wikipedia article on Binary Search Trees,以便更好地了解应如何删除。