Мне представили дерево как вложенный вектор. Я хочу иметь обобщение indexed
для деревьев, показывая индекс каждого узла как это,
(visit 42); => [0 42]
(visit [6 7]); => [0
; [[0 6]
; [1 7]]]
Наивная реализация использовала бы clojure.zip непосредственно (как уже спросили здесь)
(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
редактор в a [:found]
вектор бесконечно). Другой подход использовал бы clojure.walk/postwalk
, но это не предоставляет структурную информацию, такую как индекс.
Как Вы реализовали бы это? Есть ли a postorder-next
для zip, которая решила бы его сразу же?