ネストされたベクトルとして表されるツリーがあります。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
に[:found]
ベクトルになります)。別のアプローチはを使用することclojure.walk/postwalk
ですが、インデックスなどの構造情報を提供しません。
これをどのように実装しますか?postorder-next
すぐに解決するforzipはありますか?