protected Iterator<DR> iterator(NR node, Q query) {
		if (node.getType().isLeaf()) {
			List<DR> data = new ArrayList<>(node.getChildCount());
			for (DR d : getDataChildrenOf(node)) {
				if (query != null && !query.testData(d.getShape())) {
					continue;
				}
				data.add(d);
			}
			return data.iterator();
		}
		List<NR> nodes = new ArrayList<>(node.getChildCount());
		for (NR n : getNodeChildrenOf(node)) {
			if (query != null && query.testNode(n.getShape()) == QueryInclusion.NONE) {
				continue;
			}
			nodes.add(n);
		}
		return NestedIterator.start(nodes.iterator(), n -> iterator(n, query));
	}
Called when a node is finished being visited.

This only applies to nodes into which the visitor descends. The visitor will finish a
node in one of three ways: 1) The node's children have all been visited. 2) The visitor
returned {@link VisitResult#TERMINATE} while visiting a descendant. 3) The visitor
returned {@link VisitResult#ASCEND} while visiting a child.

This method may return any result except {@link VisitResult#DESCEND}. If the visitor is
terminating, the return value of this method is ignored.

@param parent the parent of this node, or {@code null} when visiting the root
@param n the node currently being visited
@param inclusion the original inclusion of the query before descending
@return a directive for how the visitor should proceed
Ghidra/Debug/ProposedUtils/src/main/java/ghidra/util/database/spatial/AbstractConstraintsTree.java