package net.sourceforge.tuned; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; public abstract class TreeIterator implements Iterator { private final LinkedList> recursionStack = new LinkedList>(); public TreeIterator(T... root) { recursionStack.push(Arrays.asList(root).iterator()); } protected abstract Iterator children(T node); @Override public boolean hasNext() { return currentIterator().hasNext(); } @Override public T next() { T node = currentIterator().next(); Iterator children = children(node); if (children != null && children.hasNext()) { // step into next recursion level recursionStack.push(children); } return node; } private Iterator currentIterator() { Iterator iterator = recursionStack.peek(); if (iterator.hasNext() || recursionStack.size() <= 1) return iterator; // step back one recursion level recursionStack.pop(); return currentIterator(); } @Override public void remove() { // can't just use remove() on current iterator, because // we may have stepped into the next recursion level throw new UnsupportedOperationException(); } }