(def data [{:code "11", :level 1}
{:code "1101", :level 2}
{:code "110101", :level 3}
{:code "1102", :level 2}
{:code "110102", :level 3}])
(defn push [m k v]
(if-let [vs (get m k)]
(assoc m k (conj vs v))
(assoc m k [v])))
(defn parent? [sup node]
(.startsWith (:code node) (:code sup)))
(defn sub-attach [node sups]
(for [sup sups]
(if (parent? sup node)
(push sup :sub node)
sup)))
(defn sub-tree [data]
(let [data (partition-by :level (sort-by :level > data))]
(clojure.pprint/pprint data)
(reduce (fn [subs sups]
(reduce #(sub-attach %2 %1) sups subs))
data)))