package structure; class BTInorderIteratorR implements Iterator { //+implementation protected BinaryTreeNode root; // root of traversed subtree protected Queue todo; // queue of unvisited elements public BTInorderIteratorR(BinaryTreeNode root) // post: constructs an iterator to traverse in inorder { todo = new QueueList(); this.root = root; reset(); } public void reset() // post: resets the iterator to retraverse { todo.clear(); enqueueInorder(root); } protected void enqueueInorder(BinaryTreeNode current) // pre: current is non-null // post: enqueue all values found in tree rooted at current // in inorder { if (current == null) return; enqueueInorder(current.left()); todo.enqueue(current); enqueueInorder(current.right()); } //-implementation //+prePost protected void enqueuePreorder(BinaryTreeNode current) // pre: current is non-null // post: enqueue all values found in tree rooted at current // in preorder { if (current == null) return; todo.enqueue(current); enqueuePreorder(current.left()); enqueuePreorder(current.right()); } protected void enqueuePostorder(BinaryTreeNode current) // pre: current is non-null // post: enqueue all values found in tree rooted at current // in postorder { if (current == null) return; enqueuePostorder(current.left()); enqueuePostorder(current.right()); todo.enqueue(current); } //-prePost public boolean hasMoreElements() // post: returns true iff iterator is not finished { return !todo.isEmpty(); } public Object value() // pre: hasMoreElements() // post: returns reference to current value { return ((BinaryTreeNode)todo.peek()).value(); } //+implementation public Object nextElement() // pre: hasMoreElements(); // post: returns current value, increments iterator { BinaryTreeNode current = (BinaryTreeNode)todo.dequeue(); return current.value(); } //-implementation }