2014-10-20 32 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