我不确定我是否理解您要做什么,但是示例向我建议,分配给节点的索引对应于它们的左兄弟(因为在第二个示例中,根节点和
6
孩子被贴上标签
0
)
更新:显然我只是误读了
visit
第一轮的例子——它使意图足够清晰……幸运的是,现在我读得很好,我觉得下面的答案是正确的。
如果这是正确的,这是
clojure.walk/postwalk
-基于解决方案:
(defn index-vec-tree [vt]
[0 (walk/postwalk
(fn [node]
(if-not (vector? node)
node
(vec (map-indexed vector node))))
vt)])
举例说明:
user> (index-vec-tree [6 7])
[0 [[0 6] [1 7]]]
user> (index-vec-tree 42)
[0 42]
更新:
使用的简单解决方案
map-indexed
(在1.2中可用;使用
map
+
clojure.contrib.seq-utils/indexed
1.1):
(defn index-vec-tree [vt]
(letfn [(iter [i vt] [i (if (vector? vt)
(vec (map-indexed iter vt))
vt)])]
(iter 0 vt)))