package com.metservice.kanban.model; import java.util.Iterator; public class TreeIterator<T> implements Iterator<T> { private TraversalPosition<T> position; public TreeIterator(TreeNode<T> root) { this.position = new TraversalPosition<T>(null, root); } @Override public boolean hasNext() { return position != null; } @Override public T next() { T result = position.getNode().getValue(); position = position.advance(); return result; } @Override public void remove() { throw new UnsupportedOperationException(); } private static class TraversalPosition<T> { private static final int NODE_ITSELF = -1; private final TraversalPosition<T> parent; private final TreeNode<T> node; private int branchIndex; public TraversalPosition(TraversalPosition<T> parent, TreeNode<T> node) { this.parent = parent; this.node = node; this.branchIndex = NODE_ITSELF; } public TraversalPosition<T> advance() { int nextIndex = branchIndex + 1; if (nextIndex < node.getNumberOfChildren()) { branchIndex = nextIndex; return new TraversalPosition<T>(this, node.getChild(branchIndex)); } return parent == null ? null : parent.advance(); } public TreeNode<T> getNode() { return node; } } }