You're doing exact quantiling here, which is good. The downside here is it requires a sort on each data column, which is potentially expensive.

I wonder how bad it would be to approximate with low-high and split values at intervals of (low-high)/#bins - this way we'd effectively have fixed width histograms in one pass over the data (just collect max and min for each feature). This is pretty outlier sensitive, but maybe worth thinking about.

Finally, I'm wondering how effective this strategy will be on low-variance or highly sparse columns where 90% of the data has the same value. In that case, your conversion of split predicates to sets effectively drops the #of split candidates for a particular column down to close to 0 (or even to 0), even though there might be some signal there. I've never used Decision Trees on data with that kind of skew in practice, but I imagine it's common in e.g. online marketing.