我从头开始编写BinaryTree结构,其中包含一个remove(Object obj)方法,用于从所述树中删除元素。除了整数之外,它似乎对每种类型都能正常运行,我无法弄清楚原因。
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,它还实现了我构建的Set:
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。
以下是TreeSet中的remove(Object obj)方法,该方法又调用我最初发布的remove方法:
public boolean remove(Object obj){
if(!contains(obj)) return false;
tree = tree.remove(obj);
size--;
return true;
}