树遍历与corecursion

Kon*_*rus 8 algorithm clojure

我试图用非平凡的(即不是Fibonacci)来解决Clojure中的核心运行,但是可以管理的例子.显然,可以使用corecursion实现二叉树遍历.维基百科在Python中有一个我无法理解的例子.

如何在Clojure中实现它?假设我正在寻找BFS,但它可能是任何订单.

这是我到目前为止所拥有的:

(defstruct tree :val :left :right)

(def my-tree (struct tree 1 (struct tree 2) (struct tree 3 4 5)))

(def bfs (lazy-cat [my-tree] (map #(:left %) bfs) (map #(:right %) bfs) ))

(println (take 4 bfs))
Run Code Online (Sandbox Code Playgroud)

不幸的是,它似乎一直向左,忽略了正确的分支.

Ale*_*art 8

假设Michal的代码做你想要的,这也有效:

(defn bftrav [& trees]
  (when trees
    (concat trees 
      (->> trees
        (mapcat #(vector (:left %) (:right%)))
        (filter identity)
        (apply bftrav)))))
Run Code Online (Sandbox Code Playgroud)

  • 这太好了...... +1.您可以将`#(vector ...)`替换为`(juxt:left:right)`以使其更漂亮.:-) (5认同)
  • 前几天我只是对自己说,"juxt有什么意义?" 优秀! (2认同)