2013-02-22 60 views
2

說我有一個樹和節點孩子的以下地圖:Clojure的地圖轉換(孩子父親在樹上)

(def a {0 [], 1 [], 2 [0, 1]}) 

在其根部和兩個對應於樹節點葉節點和作爲節點的孩子。

我如何將它轉換成父親的地圖,或者更好的是,將它與父親一起裝飾。例如。在父親的下列地圖到達:

{0 2, 1 2, 2 nil} ; each node only has one father at most 

或者,更好的是,在下面的圖,結合孩子和父親:

{0 [[] 2], 1 [[] 2], 2 [[0,1] nil]} 
+0

什麼指定的根,它是最後一個? – 2013-02-22 18:23:02

+0

我認爲根是唯一沒有父母的人,即不是某個人的孩子。 – 2013-02-22 18:29:46

+0

沒有父母的人,你可能只假定一個根(一棵樹,而不是一個森林)。 – 2013-02-22 18:35:58

回答

2
(defn parents [m] 
    (let [plist (into {} (for [[k v] m vv v] [vv k]))] 
    (into {} (map (fn [[k v]] [k [v (plist k)]]) m)))) 

(parents a) 
=> {0 [[] 2], 1 [[] 2], 2 [[0 1] nil]} 
4

第一個位:

(def a {0 [], 1 [], 2 [0, 1]}) 

(defn parent-map [m] 
    (reduce 
    (fn [x [k v]] 
     (into x (zipmap v (repeat k)))) {} m)) 

(def parent (parent-map a)) 

parent 
=> {1 2, 0 2} 
(parent 1) 
=> 2 
(parent 2) 
=> nil 

所以,不需要明確在父映射中有2 nil

二位:

(defn parent-child-map [m] 
    (let [parent (parent-map m)] 
    (reduce 
     (fn [x [k v]] 
     (assoc x k [(m k) (parent k)])) {} m))) 

(parent-child-map a) 
=> {2 [[0 1] nil], 1 [[] 2], 0 [[] 2]} 

的東西一點點更有趣:

(def b {0 [], 1 [], 2 [], 3 [], 4 [0 1 2], 5 [3], 6 [4 5]}) 

(parent-child-map b) 
=> 
{6 [[4 5] nil], 
5 [[3] 6], 
4 [[0 1 2] 6], 
3 [[] 5], 
2 [[] 4], 
1 [[] 4], 
0 [[] 4]} 
+0

我可能應該命名爲孩子父母而不是父母孩子...... – 2013-02-22 18:46:10

+0

謝謝你的回答我希望我可以接受這兩種方式,但是我最終接受了mobyte的,因爲一旦我明白了,理解似乎更加清晰。 – 2013-02-25 08:11:11