Ho un albero rappresentato come vettore annidato. Voglio avere una generalizzazione indexed
per alberi, mostrando l'indice di ogni nodo simili,Traversal dell'albero postale con clojure.zip per modificare i nodi
(visit 42); => [0 42]
(visit [6 7]); => [0
; [[0 6]
; [1 7]]]
L'attuazione naive userebbe clojure.zip direttamente (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))]
%)))))))
Ma ripetono clojure.zip/next
esegue un attraversamento preordinato, creando un loop infinito in questo caso (i nodi non visitati ricevono conj
in un vettore infinitamente [:found]
). Un altro approccio sarebbe utilizzare clojure.walk/postwalk
, ma non fornisce informazioni strutturali, come l'indice.
Come implementeresti questo? C'è uno postorder-next
per zip che lo risolverebbe subito?
È un piacere leggere di nuovo una risposta solida da parte vostra –