Моя первая попытка не имела ничего нового для добавления, но потом я начал задумываться о глубине рекурсии и о том, можно ли было бы перестроить код, чтобы воспользоваться преимуществами функции хвостового вызова в новейшем компиляторе Java. Основной проблемой был нулевой тест, который можно решить с помощью NullObject. Я не уверен, может ли TCO справиться с обоими рекурсивными вызовами, но он должен хотя бы оптимизировать последний.
static class NullNode extends Tree {
private static final Tree s_instance = new NullNode();
static Tree instance() {
return s_instance;
}
@Override
Tree getRightChild() {
return null;
}
@Override
Tree getLeftChild() {
return null;
}
int count() {
return 0;
}
}
int count() {
Tree right = getRightChild();
Tree left = getLeftChild();
if ( right == null ) { right = NullNode.instance(); }
if ( left == null ) { left = NullNode.instance(); }
return 1 + right.count() + left.count();
}
Точная реализация NullNode зависит от реализаций, используемых в Tree - если Tree использует NullNode вместо null, то, возможно, дочерние методы доступа должны генерировать NullPointerException вместо возврата null. В любом случае, основная идея - использовать NullObject, чтобы попытаться получить выгоду от TCO.