2014-05-17 40 views
-2

我希望能夠使用每個循環,但我在無限循環結束。
我不使用遞歸和調試器不給我任何提示。如果是這樣,我不明白。

這裏是我的測試:的java:執行二叉搜索樹和覆蓋迭代

Student stud1 = new Student("nic", "aichael", "1234", 75, 90); 
    Student stud2 = new Student("nic", "bichael", "1234", 75, 90); 
    Student stud3 = new Student("nic", "cichael", "1234", 75, 90); 
    Student stud4 = new Student("nic", "dichael", "1234", 75, 90); 
    AVLPersonTree tree = new AVLPersonTree(); 
    tree.add(stud1); 
    tree.add(stud2); 
    tree.add(stud3); 
    tree.add(stud4); 
    for(Node node: tree){ 
     node.toString(); 
    } 

這裏是我AVLPersonTree類:

public class AVLPersonTree implements Iterable<Node>{ 
private Node root; 
private int size; 

public AVLPersonTree(){ 
    super(); 
    root = null; 
} 

public void add(Person newPerson){ 
    Node newNode = new Node(newPerson); 
    if(root == null){ 
     root = newNode; 
    }else{ 
     root.addNode(newNode); 
    } 
    size++; 
} 

public int size(){ 
    return size; 
} 


@Override 
public Iterator iterator() { 
    Iterator<Node> iterate = new Iterator(){ 

     @Override 
     public boolean hasNext() { 
      if(root == null){ 
       return false; 
      } 
      if(root.getLeftNode() == null && root.getRightNode() == null){ 
       return false; 
      } 
      return true; 
     } 

     @Override 
     public Node next() { 
      if (!hasNext()) { 
       throw new java.util.NoSuchElementException("no more elements"); 
      } 
      return preorderNext(); 
      } 

     @Override 
     public void remove() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

    }; 
    return iterate; 
} 

private Node preorderNext() { 
    Stack<Node> visiting = new Stack<>(); 
if (visiting.empty()) { // at beginning of iterator 
    visiting.push(root); 
} 
Node node = visiting.pop(); 
// need to visit the left subtree first, then the right 
// since a stack is a LIFO, push the right subtree first, then 
// the left. Only push non-null trees 
if (node.getRightNode() != null) { 
    visiting.push(node.getRightNode()); 
} 
if (node.getLeftNode() != null) { 
    visiting.push(node.getLeftNode()); 
} 
// may not have pushed anything. If so, we are at the end 
if (visiting.empty()) { // no more nodes to visit 
    root = null; 
} 
return node; 
} 

}

+0

那麼,什麼是問題? – Makoto

+0

無限期地爲每個循環 – Nicolas

回答

1

你 「preorderNext」 功能是錯誤的。

的5號線在begening總會帶給你的「根」中的「節點」

Stack<Node> visiting = new Stack<>(); 
if (visiting.empty()) { // at beginning of iterator 
visiting.push(root); 
} 
Node node = visiting.pop(); 

所以你從來沒有真正迭代,該節點將成爲永遠的「根」