2014-10-20 29 views
0

我正在尝试在Clojure中为给定的树结构打印预订单(根,左和右)中的树元素。如何在Clojure中打印以“ire”结尾的树元素?

下面是代码打印预订单中的元素,但我无法弄清楚如何应用条件来检查字符串以“ire”结尾。

我尝试使用过滤器,以及时。有人可以帮忙吗?

(defn preorder [tree] 
    (if (nil? (:root tree)) 
    (str nil) 
    (let [v (:root tree) 
      l (:left tree) 
      r (:right tree)] 
     (str v 
      (str " ") 
      (str l (str " ") (preorder l)) 
      (str " ") 
      (str r (str " ")(preorder r)))))) 
+0

我找不到你要找的东西。但是'(.endsWith“fire”“ire”)'可以检查'fire'是否以'ire'结尾 – ymonad 2014-10-20 03:59:13

+0

这段代码已经遍历一棵树,我正在寻找的是如何在代码中应用条件。一:(.ends与“火”“ire”)。我试着做(.endsWith树“ire”),但是当我将左右树传递给它时,会抛出空指针异常。 – abc 2014-10-20 04:07:41

+0

你能给我们树的例子吗? – ymonad 2014-10-20 04:15:30

回答

2

建议:

  • 算法:生成序列:root值走的树。 使用序列库mapfilter将其转换为字符串 或根据需要过滤节点。
  • 数据::left和使用nil:right而不是为 :root

这样:

(defn preorder [tree] 
    (if tree 
    (let [v (:root tree) 
      l (:left tree) 
      r (:right tree)] 
     (cons v (concat (preorder l) (preorder r)))))) 

例如

(preorder {:root 5, :left {:root 10}}) 
;(5 10) 

(filter even? (preorder {:root 5, :left {:root 10}})) 
;(10) 

当心,你将用完栈,如果你的树是太深了。

+0

关于堆栈的事情,我认为用'懒猫'替换'concat'会解决这个问题 – noisesmith 2014-10-20 15:48:12

+0

@noisesmith我不确定。 ['tree-walk'](https://github.com/clojure/clojure/blob/clojure-1.6.0/src/clj/clojure/core.clj#L4535)将整个表达式封装在一个'lazy-seq '。 – Thumbnail 2014-10-20 18:28:37

+0

@noisesmith它可能会,但我宁愿将整个函数体包装在'lazy-seq'中。 – amalloy 2014-10-20 19:55:43