2015-04-04 32 views
0

因此,對於我的數據結構和算法類,我們已經重建了java.util包。我知道在這裏發佈了一個類似的問題:BinarySearchTree remove method malfunctioning when removing integers,但遺憾的是,這個問題還不夠具體。這裏是驅動&輸出:TreeSet類中的迭代器移除方法問題

import set.*; 
import list.*; 

public class HwTreeSetDriver 
{ 
public static void main() 
{ 
    Set <Integer> values; 
    values = new TreeSet <Integer>(); 

    if (!values.isEmpty()) 
     System.err.println ("Error in isEmpty "); 

    values.add (3); 
    values.add (5); 
    values.add (3); 

    // No news is good news 

    if (values.size() != 2) 
     System.err.println ("Error in size "); 
    if (values.isEmpty()) 
     System.err.println ("Error in isEmpty "); 

    for (int j=0; j<5; j++) 
     values.add (j * 10); 

    if (values.contains (15)) 
     System.err.println ("Error in contains "); 
    if (!values.contains (20)) 
     System.err.println ("Error in contains "); 

    if (values.remove (2)) 
     System.err.println ("Error in remove "); 
    if (!values.remove (0)) 
     System.err.println ("Error in remove "); 
    if (values.size() != 6) 
     System.err.println ("Error in size or remove "); 

    Iterator<Integer> itty = values.iterator(); 
    while (itty.hasNext()) 
     if (itty.next() % 2 == 1) 
      itty.remove();    // remove odd numbers 

    System.out.println ("After removing odd values, set is " + values); 
    System.out.println ("size is " + values.size()); 
    if (values.size() != 4) 
     System.err.println ("Error in size or iterator "); 

    values.clear(); 
    if (!values.isEmpty()) 
     System.err.println ("Error in clear or isEmpty "); 

    values.add (17); 

    System.out.println ("Testing complete"); 

} 
} 

司機提供以下的輸出:

After removing odd values, set is [3, 5, 10, 20, 30, 40] 
size is 6 
Testing complete 

Error in size or iterator 

的問題是,當值樹進行檢查,值都還在那裏,但是當你看在TreeIterator裏面的值樹(見下面)裏面的樹是正確的。它似乎永遠不會更新原始樹(值)。我一直在試圖找出爲什麼它沒有,但我似乎無法找出問題。使用java.util。*的驅動函數來證明它會給出正確的輸出。

這裏是TreeSet類:

package set; 
import tree.*; 
import list.*; 

public class TreeSet<E extends Comparable <E>> implements Set<E>{ 
BinaryTree<E> tree = new EmptyBinarySearchTree<E>(); 
int size = 0; 

public int size(){ 
    return size; 
} 

public boolean add(E value){ 
    if(tree.containsKey(value)) 
     return false; 
    tree = tree.add(value); 
    size++; 
    return true; 
} 

public boolean contains(Object obj){ 
    E value; 
    try{ 
     value = (E) obj; 
     return tree.containsKey(value); 
    } 
    catch(ClassCastException cce){ 
     return false; 
    } 
} 

public void clear(){ 
    tree = new EmptyBinarySearchTree(); 
    size = 0; 
} 

public boolean remove(Object obj){ 
    if(!(contains(obj))) 
     return false; 
    tree = tree.remove(obj); 
    size--; 
    return true; 
} 

public Iterator<E> iterator(){ 
    return tree.iterator(); 
} 

public boolean isEmpty(){ 
    return size == 0; 
} 

public String toString(){ 
    return tree.toString(); 
} 
} 

這裏是BinarySearchTree它使用:

package tree; 
import list.*; 

public class BinarySearchTree<E extends Comparable<E>> implements BinaryTree<E>{ 

BinaryTree<E> left; 
BinaryTree<E> right; 
E value; 
public BinarySearchTree(E value){ 
    this.value=value; 
    left=new EmptyBinarySearchTree<E>(); 
    right=new EmptyBinarySearchTree<E>(); 
} 

public BinaryTree<E> getLeft(){ 
    return left; 
} 

public BinaryTree<E> getRight(){ 
    return right; 
} 

public BinaryTree<E> add(E value){ 
    int cmp = value.compareTo(this.value); 
    if(cmp<0) 
     left = left.add(value); 
    if(cmp>0) 
     right = right.add(value); 
    return this; 
} 

public boolean containsKey(E value){ 
    int cmp = value.compareTo(this.value);   
    if(cmp==0) 
     return true; 
    if(cmp<0) 
     return left.containsKey(value); 
    return right.containsKey(value); 
} 

public E getValue(){ 
    return this.value; 
} 

public E get(E value){ 
    int cmp = value.compareTo(this.value); 
    if(cmp<0) 
     return left.get(value); 
    if(cmp>0) 
     return right.get(value); 
    return this.value; 
} 

private BinaryTree<E> smallest(){ 
    if(left instanceof BinarySearchTree){ 
     return ((BinarySearchTree<E>)left).smallest(); 
    } 
    return this; 
} 

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 ece){} 
    return this; 
} 

private List<BinaryTree<E>> children(){ 
    List<BinaryTree<E>>result = new ArrayList<>(); 
    if(left instanceof BinarySearchTree){ 
     result.add(left); 
    } 
    if(right instanceof BinarySearchTree){ 
     result.add(right); 
    } 
    return result; 
} 

public void setValue(E value){ 
    this.value=value; 
} 

public Iterator<E> iterator(){ 
    return new TreeIterator<E>(this); 
} 

public String toString(){ 
    String result = "["; 
    Iterator<E> itty = iterator(); 
    while(itty.hasNext()){ 
     result+=itty.next(); 
     if(itty.hasNext()){ 
      result+=", "; 
     } 
    } 
    result+="]"; 
    return result; 
} 

public void setRight(BinaryTree<E>right){ 
    right=right; 
} 

public void setLeft(BinaryTree<E>left){ 
    left=left; 
} 

public boolean isEmpty(){ 
    return value == null; 
} 

public E getLargest(){ 
    if(right instanceof BinarySearchTree){ 
     return ((BinarySearchTree<E>)right).getLargest(); 
    } 
    return this.value; 
} 
} 

最後這裏是它採用了TreeIterator:

package tree; 
import list.*; 
import queue.*; 

public class TreeIterator<E> implements Iterator<E>{ 
private BinaryTree<E>tree; 
private QueueADT<E>queue = new ArrayQueue<>(); 
private E lastGotten; 
/** 
* Constructor for objects of class TreeIterator 
*/ 
public TreeIterator(BinaryTree<E> tree){ 
    this.tree=tree; 
    this.buildQ(tree); 
} 

private void buildQ(BinaryTree<E> tree){ 
    if(tree.getLeft() instanceof BinarySearchTree) 
     buildQ(tree.getLeft()); 
    queue.add(tree.getValue()); 
    if(tree.getRight() instanceof BinarySearchTree) 
     buildQ(tree.getRight()); 
} 

public boolean hasNext(){ 
    return !queue.isEmpty(); 
} 

public E next(){ 
    lastGotten=queue.remove(); 
    return lastGotten; 
} 

public void remove(){ 
    tree=tree.remove(lastGotten); 
} 

} 

這些都是供參考的,因爲沒有使用java.util。

回答

0

通過創建專門爲TreeSet定製的迭代器可以解決問題。 HashSet迭代器的類似實現以供將來參考。

package set; 
import tree.*; 
import list.*; 

public class TreeSetIterator<E extends Comparable <E>> extends   TreeIterator<E>{ 
TreeSet<E> set; 

public TreeSetIterator(TreeSet<E> set){ 
    super(set.tree); 
    this.set=set; 
} 

public void remove(){ 
    set.tree=set.tree.remove(getLastGotten()); 
    set.size--; 
} 
}