То, что я забыл, - это различные типы операторов (символ) и операнд (двойной). Как только я понял это, в методе visit () мы можем проверить, является ли узел оператором (внутренний узел), затем проверить, какой оператор (+, -, /, *), затем вызвать метод accept () слева иправые узлы (приводя оба к двойникам) с действительным оператором между ними.
Пример:
if (n.getContent() == (Object) '+')
d = (Double) n.getLeft().accept(this) + (Double) n.getRight().accept(this);
d - переменная типа Double. Это будет вызываться до тех пор, пока мы не достигнем операнда (конечного узла), который мы проверяем в методе visit () следующим образом:
// If node has no children, we are at an operand (Double)
if (n.getLeft() == null && n.getRight() == null)
return Double.parseDouble(n.getContent().toString());
Это вернет значение в исходный вызов accept () и добавитдва значения вместе в этом случае.
Ответ на сохранение для последующего использования.