package lab06; import java.util.*; class BTreeNode { T element; BTreeNode leftChild, rightChild; BTreeNode( T element, BTreeNode leftChild, BTreeNode rightChild ){ this.element = element; this.leftChild = leftChild; this.rightChild = rightChild; } T getElement(){ return element; } BTreeNode getLeft(){ return leftChild; } BTreeNode getRight(){ return rightChild; } } class LevelorderIterator implements Iterator{ // We will use the LinkedList implementation for our Queue LinkedList> iteratorQueue; LevelorderIterator(BTreeNode root){ iteratorQueue = new LinkedList>(); iteratorQueue.add(root); } public boolean hasNext() { return !iteratorQueue.isEmpty(); } public T next() { // Remove current node from the queue. BTreeNode curNode = iteratorQueue.remove(); // Add the left child of curNode if present to the queue. if( curNode.getLeft() != null ) iteratorQueue.add(curNode.getLeft()); // Add the right child of curNode if present to the queue. if( curNode.getRight() != null ) iteratorQueue.add(curNode.getRight()); // Return the data (element) for curNode. return curNode.getElement(); } public void remove() {} } // StackElement has two fields: BTreeNode and a boolean visited, // this class will be used in Inorder, Preorder and Postorder iterators below. class StackElement { BTreeNode btreeNode; boolean visited; StackElement( BTreeNode btreeNode, boolean visited ){ this.btreeNode = btreeNode; this.visited = visited; } BTreeNode getNode(){ return btreeNode; } boolean isVisited(){ return visited; } } class InorderIterator implements Iterator{ Stack> iteratorStack; InorderIterator(BTreeNode root){ iteratorStack = new Stack>(); iteratorStack.push(new StackElement(root, false)); } public boolean hasNext() { return !iteratorStack.isEmpty(); } public T next() { // Repeat until we have a visited node on top of the stack. while( !iteratorStack.peek().isVisited() ){ // Get current node from top of the stack. BTreeNode curNode = iteratorStack.pop().getNode(); // If right child is present, push it on the stack as not-visited. if( curNode.getRight() != null ) iteratorStack.push( new StackElement(curNode.getRight(), false) ); // Push current node on the stack as visited. iteratorStack.push(new StackElement(curNode, true)); // If left child is present, push it on the stack as not-visited. if( curNode.getLeft() != null ) iteratorStack.push(new StackElement(curNode.getLeft(), false)); } // Pop the node on top of the stack (this node is a visited node) // and return its data. return iteratorStack.pop().getNode().getElement(); } public void remove() {} } class PreorderIterator implements Iterator{ Stack> iteratorStack; PreorderIterator(BTreeNode root){ iteratorStack = new Stack>(); iteratorStack.push(new StackElement(root, false)); } public boolean hasNext() { return !iteratorStack.isEmpty(); } public T next() { while( !iteratorStack.peek().isVisited() ){ BTreeNode curNode = iteratorStack.pop().getNode(); // TASK: // Fill in the code here for PreorderIterator.next() following // the example for InorderIterator.next(). // If right child is present, push it on the stack as not-visited. if( curNode.getRight() != null ) iteratorStack.push( new StackElement(curNode.getRight(), false) ); if( curNode.getLeft() != null ) iteratorStack.push( new StackElement(curNode.getLeft(), false) ); iteratorStack.push(new StackElement(curNode, true)); } return iteratorStack.pop().getNode().getElement(); } public void remove() {} } class PostorderIterator implements Iterator{ Stack> iteratorStack; PostorderIterator(BTreeNode root){ iteratorStack = new Stack>(); iteratorStack.push(new StackElement(root, false)); } public boolean hasNext() { return !iteratorStack.isEmpty(); } public T next() { while( !iteratorStack.peek().isVisited() ){ BTreeNode curNode = iteratorStack.pop().getNode(); // TASK: // Fill in the code here for PostorderIterator.next() following // the example for InorderIterator.next(). iteratorStack.push(new StackElement(curNode, true)); if( curNode.getRight() != null ) iteratorStack.push( new StackElement(curNode.getRight(), false) ); if( curNode.getLeft() != null ) iteratorStack.push( new StackElement(curNode.getLeft(), false) ); } return iteratorStack.pop().getNode().getElement(); } public void remove() {} } public class BTree { BTreeNode root; BTree(BTreeNode root){ this.root = root; } Iterator getLevelOrderIterator(){ return new LevelorderIterator(root); } Iterator getInOrderIterator(){ return new InorderIterator(root); } Iterator getPreOrderIterator(){ return new PreorderIterator(root); } Iterator getPostOrderIterator(){ return new PostorderIterator(root); } }