static L scanTree(O root, L fields) { new IdentityHashMap out; scanTree_impl(root, fields, out); ret list(out.keySet()); } static void scanTree_impl(O root, L fields, IdentityHashMap out) { if (root == null) ret; if (out.containsKey(root)) ret; out.put(root, true); for (S field : fields) scanTree_impl(getOpt(root, field), fields, out); }