///////////////////////////////////////////////////////////////////// private class MyPreorderIterator implements Iterator<T> { private Stack<Node> path; private MyPreorderIterator() { path = new Stack<Node>(); if (MyBinaryTree.this.root != null) path.push(MyBinaryTree.this.root); } public boolean hasNext() { return !path.empty(); } public T next() { Node p = path.peek(); T value = p.value; if (p.left != null) path.push(p.left); else if (p.right != null) path.push(p.right); else { p = path.pop(); assert p != null; if (!path.empty()) { Node prev = path.peek(); // parent of p assert prev != null; if (prev.right == p) while (prev != null && prev.right == p && !path.empty()) { p = path.pop(); prev = path.peek(); } else while (prev != null && prev.left == p && prev.right == null && !path.empty()) { p = path.pop(); prev = path.peek(); } if (path.empty()){} else if (prev.right != null) path.push(prev.right); else while (!path.empty()) p = path.pop(); } } return value; } public void remove() { throw new UnsupportedOperationException(getClass().getName() + ".MyPreorderIterator.remove is not supported"); } } public Iterator<T> getPreorderIterator() { return new MyPreorderIterator(); } ///////////////////////////////////////////////////////////////////// private class MyInorderIterator implements Iterator<T> { private Stack<Node> path; private MyInorderIterator() { path = new Stack<Node>(); Node p = MyBinaryTree.this.root; while (p != null) { path.push(p); p = p.left; } } public boolean hasNext() { return !path.empty(); } public T next() { if (hasNext()) { Node prev; // parent of p Node p = path.peek(); T value = p.value; if (p.right != null) // go right, and as many lefts as it can go { p = p.right; path.push(p); while (p.left != null) path.push(p = p.left); } else do { p = path.pop(); if (path.empty()) break; prev = path.peek(); } while (prev.right == p); return value; } else throw new NoSuchElementException("illegal call to " + getClass().getName() + ".MyInorderIterator.next"); } public void remove() { throw new UnsupportedOperationException(getClass().getName() + ".MyInorderIterator.remove is not supported"); } } public Iterator<T> getInorderIterator() { return new MyInorderIterator(); } ///////////////////////////////////////////////////////////////////// private class MyPostorderIterator implements Iterator<T> { private Stack<Node> path; private MyPostorderIterator() { path = new Stack<Node>(); Node p = MyBinaryTree.this.root; while (p != null) { path.push(p); p = p.left; } } public boolean hasNext() { return !path.empty(); } public T next() { Node p = path.pop(); T value = p.value; if (!path.empty()) { Node prev = path.peek(); // parent of p if (prev.left == p) { path.push(p = prev.right); while (p.left == null && p.right != null) path.push(p = p.right); while (p.left != null) path.push(p = p.left); } } return value; } public void remove() { throw new UnsupportedOperationException(getClass().getName() + ".MyPostorderIterator.remove is not supported"); } } public Iterator<T> getPostorderIterator() { return new MyPostorderIterator(); }
[ Home | Contact Prof. Burns ]