In Naftalin, Walder Java Collections and Generics I've faced with this implementation that I love best:
public interface TreeVisitor<E, R> {
public R visit(E leaf);
public R visit(E value, Tree<E> left, Tree<E> right);
}
public abstract class Tree<E> {
public abstract <R> R accept(TreeVisitor<E, R> visitor);
public static <E> Tree<E> leaf(final E leaf) {
return new Tree<E>() {
@Override
public <R> R accept(TreeVisitor<E, R> visitor) {
return visitor.visit(leaf);
}
};
}
public static <E> Tree<E> branch(final E value, final Tree<E> left, final Tree<E> right){
return new Tree<E>(){
@Override
public <R> R accept(TreeVisitor<E, R> visitor) {
return visitor.visit(value, left, right);
}
};
}
}
Now you can add any operation you want and create your tree as follows:
Tree<Integer> t = Tree.branch(1,
Tree.branch(2,
Tree.branch(4, Tree.leaf(8), Tree.leaf(9)), Tree.leaf(5)),
Tree.branch(3, Tree.leaf(6), Tree.leaf(7));