public BucketSet getBucketSet(BucketIdFactory factory) { Stack<BucketItem> buf = new Stack<>(); for (NodeItem item : items) { if (!buf.isEmpty()) { while (buf.peek().operator > item.operator) { combineBuckets(buf); } } buf.push(new BucketItem(item.operator, item.node.getBucketSet(factory))); } while (buf.size() > 1) { combineBuckets(buf); } return buf.pop().buckets; }