Префиксное дерево. Сплит по категории. Можно сделать на хешах.
В результате получите ваше дерево.
Префиксное дерево:
https://en.wikipedia.org/wiki/Trie
--------
Псевдокод
Для каждого <item>:
Взять категории по порядку. [cat1,cat2,cat3]
Уложить этот путь в trie.
В качестве листа, указать все остальные<не категории> элементы item
Готово
-------
Если у вас есть дубликаты характеризующих атрибутов для элементов Например: не
ID name а pbbpp. То используйте алгоритм Недельман Вунша по выравниванию строк с бэктрекингом. Токинизируете по характеризующим элементам.