@Override public boolean hasNext() { if (stack.isEmpty()) { return false; } PeekableListIterator<SpanNode> iterator = stack.peek(); if (!iterator.hasNext()) { stack.pop(); return hasNext(); } SpanNode node = iterator.peek(); if (!iterator.traversed) { //we set the traversed flag on our way down iterator.traversed = true; stack.push(new PeekableListIterator<SpanNode>(node.childIterator())); return hasNext(); } return true; }