package utility.euler_tour; import tree.binarytree.*; import position.Position; public abstract class EulerTour { protected BinaryTree tree; public abstract R execute(BinaryTree T); protected void init(BinaryTree T) { tree = T; } protected R eulerTour(Position v) { TourResult r = new TourResult(); visitLeft(v, r); if (tree.hasLeft(v)) r.left = eulerTour(tree.left(v)); visitBelow(v, r); if (tree.hasRight(v)) r.right = eulerTour(tree.right(v)); visitRight(v, r); return r.out; } protected void visitLeft(Position v, TourResult r) {} protected void visitBelow(Position v, TourResult r) {} protected void visitRight(Position v, TourResult r) {} public class TourResult { public R left; public R right; public R out; } }