如何将seq转换为树

mur*_*a52 6 clojure

我有一个seq的地图,如下面的coll.我想把它安排在一棵树上.每个映射都有一个名为:parent的键,它是父对象的id.关于我该怎么做的任何提示?

(def coll [{:id 1} 
          {:id 2 :parent 1} 
          {:id 3 :parent 1}
          {:id 4 :parent 2}
          {:id 5 :parent 4}
          {:id 6 :parent 5}
          {:id 7 :parent 5}
          {:id 8 :parent 5}
          {:id 9 :parent 7}])
Run Code Online (Sandbox Code Playgroud)

A. *_*ebb 5

如果它像树一样走......

(require '[clojure.zip :as z])

(defn create-zipper [s]
  (let [g (group-by :parent s)] 
    (z/zipper g #(map :id (g %)) nil (-> nil g first :id))))

(def t (create-zipper coll)) ; using the coll defined in the OP

(-> t z/root)
;=> 1

(-> t z/children)
;=> (2 3)

(-> t z/next z/children)
;=> (4)
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用#(g (% :id))子项和(first (g nil))根目录来保留原始节点的格式(而不仅仅是返回id号).

如果需要,您可以使用后序遍历来构建树的另一个表示.