I think we should follow the Visitor design pattern. Here the operation is tree interation. We use the visitor pattern for formatting output and for operations where we walk a subtree from stem to stern. They are useful and easy to implement.
Visitors are good for moving an operation outside a class.
They are not so good for defining and extending complex walking tasks. We find it necessary to have iterators for complex walking tasks. You can let an iterator drive a visitor as well. We are doing very complex queries right now using iterators, algorithmns, functions, and operators. The problem with the last three patterns for Java is that they are template driven.