我在下面有此代码,我正在尝试为二进制搜索树创建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()方法。
答案 0 :(得分:2)
由于您假设T
实现了Comparable<T>
(通过强制转换targetElement
),因此应使用此功能。您用来比较equals
和comparableElement
的{{1}}方法是从iter.next()
类继承的方法,可能未被Object
覆盖。 T
方法的默认实现只是比较调用者的内存地址和可能不是您想要的参数。
equals
的{{1}}方法实际上是由compareTo
实现的,因此您应该改用它。 Comparable<T>
返回一个T
,它指示如果调用者为负,则调用者小于参数;如果为正,则调用者大于参数;如果为零,则调用者等于参数。 。因此,您应该将表达式compareTo
更改为int
。不需要强制转换((Comparable<T>) comparableElement).equals(iter.next())
,因为变量已经是comparableElement.compareTo(iter.next()) == 0
类型。
这是代码中所做更改的样子。
comparableElement
让我知道我是否误解了您的问题。