我需要四树的工作方式如下:反序列化广度优先树
p /| |\ /| | \ /| | \ p w b p /| |\ /| |\ /| | \ /| | \ b w w b w b w b
但他们一直在使用广度优先的顺序序列化到一个字符串,所以以前的树将有以下表现:
ppwbpbwwbwbwb
我想这样的字符串转换为嵌套向量结构:
[ [ b w w b ] w b [ w b w b] ]
用于添加复杂的例子
(defn read-quad-tree [pattern]
(loop [r []
[s & rs :as stack] []
[p & rp :as pending] (reverse pattern)]
(cond (nil? pending) (first r)
(= (count r) 4) (recur [] (conj stack (reverse r)) pending)
(= p \p) (recur (conj r s) rs rp)
:else (recur (conj r p) stack rp))))
被修改:
但有时下面的代码不能正常工作
另一个(失败)的例子。接下来的树:
| +------+-------+------+ | | | | | w w | | | +---+---+---+ +---+---+---+ | | | | | | | | | w w | | w w | | | | | +-+-+-+ +-+-+-+ +-+-+-+ +-+-+-+ | | | | | | | | | | | | | | | | b b b b w w w w b b w w b w b w
将被序列化为:
ppwwppwwppwwpbbbbwwwwbbwwbwbw
和目标是获得以下结构:
[ [ [ b b b b ] w w [ w w w w ] ] w w [ [ b b w w ] w w [ b w b w ] ] ]
但我的代码给出了不同的(错误)结构。
是否有规则,孩子总是属于一个'p'父母,其他所有字母都是树的叶子? – trincot
是的,叶节点总是'b'或'w',并且在序列化中使用'p'来指示节点有儿童。 – gimco
这对于使用[test.check](https://github.com/clojure/test.check)进行往返测试是一个很好的用例。 – gfredericks