У меня есть дерево, представленное как вложенный вектор. Я хочу иметь обобщение indexed
для деревьев, с указанием индекса каждого узла, как это,Перемещение дерева заказов с помощью clojure.zip для редактирования узлов
(visit 42); => [0 42]
(visit [6 7]); => [0
; [[0 6]
; [1 7]]]
Наивный реализация будет использовать clojure.zip непосредственно (as already asked here)
(defn visit [tree]
(loop [loc (vector-zip tree)]
(if (end? loc)
(root loc)
(recur
(next (edit loC#(conj
[(count (lefts loc))]
%)))))))
Но повторяющиеся с clojure.zip/next
выполняет обход предзаказов, в результате чего в этом случае возникает бесконечный цикл (независящие узлы получают conj
ed в вектор [:found]
бесконечно). Другим подходом будет использование clojure.walk/postwalk
, но он не содержит структурной информации, такой как индекс.
Как вы это реализуете? Есть ли postorder-next
для zip, который бы сразу решил его решить?
С радостью снова получить твердый ответ от вас –