I finally grokked what's happening here, and I see why I was confused.  Dispensing with the Item_group_ prefix, what we have here is entries and groups, which are siblings.  Entries reference individual items, and groups reference further lists of items.  I was confused because what I'd normally do is make the entry polymorphic, so each instance would reference either a list of entries (internal node) or an item (leaf node).  Both specializations of entry have the same interface*, the difference is managed internally by the implementation of get() (I don't think check() even needs to know about it).

*The one difference is constructors, one would accept an item group, and the other would accept an item tag.