我有一棵树表示为嵌套向量。我想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))]
%)))))))
但是 recurring withclojure.zip/next
会执行前序遍历,在这种情况下会导致无限循环(未访问的节点被无限地conj
编入[:found]
向量中)。另一种方法是使用clojure.walk/postwalk
,但它不提供结构信息,例如索引。
你将如何实现这一点?是否有一个postorder-next
for zip 可以立即解决它?