【问题标题】:removeAll method for BST (Binary Search Tree)BST(二叉搜索树)的 removeAll 方法
【发布时间】:2019-05-06 13:36:42
【问题描述】:

我在下面有这段代码,我正在尝试为二叉搜索树创建一个 removeAll 方法。我认为即使没有所有外部代码和上下文,下面的代码也很可能是可读的,但如果不是,我很乐意提供更多信息。但是,这段代码根本不起作用,我无法弄清楚它的原因。我只是尝试使用中序遍历遍历二叉搜索树,计算 targetElement 存在的次数,然后调用该次数的 remove 方法。

public void removeAllOccurrences(T targetElement) throws ElementNotFoundException 
   {
    removeElement(targetElement);

    Comparable<T> comparableElement = (Comparable<T>) targetElement;
    Iterator<T> iter = iteratorInOrder();
    int n = 0; 


    while(iter.hasNext())
    {
        if (((Comparable<T>) comparableElement).equals(iter.next())) 
        {
            n++;
        }
    }

    for(int i=0; i<n; i++)
    {
        removeElement(targetElement);
    }


}

类的名称是 LinkedBinarySearchTree。我们正在使用 BinaryTreeNode。我们有一个 getRootNode() 方法。

【问题讨论】:

  • 如果有人想知道,removeElement 和 iteratorInOrder() 可以正常工作。
  • 我也试过在 if 语句中使用 iter.remove() 然后删除 for 语句。也不会删除所有出现的 targetElement。
  • n 是否在增加? if 检查相等性的条件对我来说似乎有点不对劲。
  • @TheGamer007 n 如果 if 条件为真,则递增。如果找到匹配项,则增加 n,否则保持 n 不变。我知道它关闭了,但我确实知道它关闭的原因或如何修复它。

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


【解决方案1】:

由于您假设T 实现Comparable&lt;T&gt;(通过转换targetElement),您应该使用此功能。您用来比较comparableElementiter.next()equals 方法是从Object 类继承的方法,可能未被T 覆盖。 equals 方法的默认实现只是比较调用者的内存地址和可能不是你想要的参数。

Comparable&lt;T&gt;compareTo 方法实际上将由 T 实现,因此您应该改用它。 compareTo 返回一个 int,表示调用者小于参数,如果它是负数,调用者大于参数,如果它是正数,或者调用者等于参数,如果它是零。因此,您应该将表达式((Comparable&lt;T&gt;) comparableElement).equals(iter.next()) 更改为comparableElement.compareTo(iter.next()) == 0comparableElement 的强制转换不是必需的,因为变量已经是 Comparable&lt;T&gt; 类型。

这是更改在您的代码中的外观。

public void removeAllOccurrences(T targetElement) throws ElementNotFoundException {
    removeElement(targetElement);

    Comparable<T> comparableElement = (Comparable<T>) targetElement;
    Iterator<T> iter = iteratorInOrder();
    int n = 0;

    while(iter.hasNext()) {
        if (comparableElement.compareTo(iter.next()) == 0) {
            n++;
        }
    }

    for (int i = 0; i < n; i++) {
        removeElement(targetElement);
    }
}

如果我误解了你的问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2020-09-03
    • 2012-05-13
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多