Я написал структуру BinaryTree с нуля, которая включала метод remove (Object obj) для удаления элементов из указанного дерева. Кажется, он функционирует корректно для каждого типа, кроме Integer, и я не могу понять, почему.Метод удаления BinarySearchTree не работает при удалении целых чисел
public BinaryTree<E> remove(Object obj) {
try{
E value = (E)obj;
int cmp = value.compareTo(this.value);
if(cmp == 0) {
List<BinaryTree<E>> kids = children();
if(kids.size() == 0) {
return new EmptyBinarySearchTree<E>();
}
if(kids.size() == 1) {
return kids.get(0);
}
//2 children
BinaryTree<E> successor = ((BinarySearchTree)right).smallest();
BinaryTree<E> result = remove(successor.getValue());
result.setValue(successor.getValue());
return result;
}
if(cmp < 0) {
left = left.remove(value);
}
if(cmp > 0) {
right = right.remove(value);
}
}
catch(ClassCastException cce) {
}
return this;
}
Я за рулем BinaryTree со следующим, который также реализует набор, который я построил:
package setDriver;
import set.*;
import list.*;
public class HwTreeSetDriver
{
public static void main()
{
Set <Integer> values;
values = new TreeSet <Integer>();
values.add (3);
values.add (5);
values.add (3);
for (int j=0; j<5; j++)
values.add (j * 10);
Iterator<Integer> itty = values.iterator();
while (itty.hasNext())
if (itty.next() % 2 == 1)
itty.remove(); // remove odd numbers
}
}
После запуска драйвера, размер по-прежнему 6, а набор содержит 3, 5, 10, 20, 30, 40.
Ниже приведен метод remove (Object obj) в TreeSet, который в свою очередь вызывает метод удаления, который я опубликовал изначально:
public boolean remove(Object obj){
if(!contains(obj)) return false;
tree = tree.remove(obj);
size--;
return true;
}
Ну, что же делать? Без рабочего кода или сообщений об ошибках/следов стека не так много. –
Является ли 'remove' перегруженным? Есть ли версия 'remove (int)'? –
Покажите нам код, который вы используете, чтобы управлять этим при его тестировании. – CandiedOrange