Ich habe einen Baum als verschachtelten Vektor dargestellt. Ich möchte eine Verallgemeinerung von indexed
für Bäume haben, um den Index jedes Knotens wie dies zeigt,Postorder Baum Traversal mit clojure.zip, um Knoten zu bearbeiten
(visit 42); => [0 42]
(visit [6 7]); => [0
; [[0 6]
; [1 7]]]
Die naive Implementierung direkt verwenden clojure.zip würde (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))]
%)))))))
Aber wiederkehrende mit clojure.zip/next
führt eine Preorder-Traversierung durch, was in diesem Fall zu einer Endlosschleife führt (nicht besuchte Knoten erhalten conj
in einen [:found]
Vektor unendlich). Ein anderer Ansatz wäre die Verwendung von clojure.walk/postwalk
, bietet jedoch keine strukturellen Informationen wie den Index.
Wie würden Sie das umsetzen? Gibt es eine postorder-next
für Zip, die es sofort lösen würde?
Es ist eine Freude, wieder eine solide Antwort von Ihnen zu lesen –