/**
* Template for algorithms traversing a binary tree using an Euler
* tour. The subclasses of this class will redefine some of the
* methods of this class to create a specific traversal.
*/
public abstract class EulerTour {
protected InspectableBinaryTree tree;
public Object execute(BinaryTree T) {
tree = T;
return null; // nothing interesting to return
}
protected Object eulerTour(Position p) {
TraversalResult r = initResult();
if (tree.isExternal(p)) {
visitExternal(p, r);
} else {
visitLeft(p, r);
r.leftResult = eulerTour(tree.leftChild(p)); // recursive traversal
visitBelow(p, r);
r.rightResult = eulerTour(tree.rightChild(p)); // recursive traversal
visitRight(p, r);
}
return result(r);
}
// methods that can be redefined by the subclasses
protected void visitExternal(Position p, TraversalResult r) {}
protected void visitLeft(Position p, TraversalResult r) {}
protected void visitBelow(Position p, TraversalResult r) {}
protected void visitRight(Position p, TraversalResult r) {}
protected TraversalResult initResult() { return new TraversalResult(); }
protected Object result(TraversalResult r) { return r.finalResult; }
}