【问题标题】:How do I test my delete method in a BST如何在 BST 中测试我的删除方法
【发布时间】:2015-06-05 10:36:12
【问题描述】:

所以在我的二叉搜索树中,我正在尝试测试我的删除方法,看看它是否从 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 中插入了“单词”这个词,所以它应该在那里。 这是我希望删除方法执行的伪代码版本:

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 

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 最后其实还有一段我还没写。我用我希望删除方法看起来像的伪代码版本更新了我的代码。
    • 所以我在代码末尾添加了几行,看看是否可行。
    • 所以我更新了我的代码,对最后几行进行了另一次编辑,但它仍然返回失败。我的代码有什么问题?
    • 问题是,您在技术上仍然没有做任何事情。问题是,当您到达 if (word.compareTo(r.item.getWord()) 0 的概念相同。此外,您的 else if(r.left != null && r.right != null) 的主体没有意义。这基本上是说,如果 r 有两个孩子,请再次检查 r。这会给你一个无限循环。你需要一个终止条件 word.compare(r) == 0
    【解决方案2】:

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

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

    【讨论】:

    • 我将我的代码更新为我希望 delete 方法执行的伪代码版本,并在最后添加了几行。那会使 delete 方法实际删除节点吗?
    • 另外加上我的新行仍然说它失败了。那么我的代码有什么问题呢?
    • 代码中的一个问题示例是您在word.compareTo(r.item.getWord()) &lt; 0 时所做的事情。您返回 r 并且不要继续搜索 word。相反,您应该在左子树上调用deleteItem()。检查我链接的答案以获得更全面的解释。
    • 好吧,我所做的不是返回 r 我说 r.left = deleteItem(r.left, word);然后 r.right 如果它 > 0 但它仍然失败,那么方法的最后几行的问题是什么?
    • 我用对最后几行的更改更新了我的代码,但它仍然让我失败。我做错了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多