У меня есть список узлов, каждый из которых имеет родительский элемент, и я хочу построить дерево из них.Создайте дерево из списка узлов, родительских элементов
(def elems '[{:node A :parent nil} {:node B :parent A} {:node C :parent A} {:node D :parent C}])
(build-tree elems)
=> (A (B) (C (D)))
В настоящее время у меня есть этот код:
(defn root-node [elems]
(:node (first (remove :parent elems))))
(defn children [elems root]
(map :node (filter #(= root (:parent %)) elems)))
(defn create-sub-tree [elems root-node]
(conj (map #(create-sub-tree elems %) (children elems root-node)) root-node))
(defn build-tree [elems]
(create-sub-tree elems (root-node elems)))
В этом решении рекурсии используется, но не с петлей повторялся синтаксис. Это плохо, потому что код не может быть оптимизирован и StackOverflowError is possible.
Кажется, что я могу использовать recur только в том случае, если у меня есть одна рекурсия на каждом шаге.
В случае дерева у меня есть рекурсия для каждого дочернего узла.
Я ищу скорректированное решение, которое бы не столкнулось с этой проблемой.
Если у вас есть совершенно другое решение этой проблемы, я бы с удовольствием ее увидел.
Я читал немного о молнии, возможно, это лучший способ построить дерево.