2014-05-17 35 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(); 

所以你从来没有真正迭代,该节点将成为永远的“根”