Représentant un arbre à Clojure

Quelle serait une façon idiomatique de représenter un arbre dans Clojure? Par exemple:

     A
    / 
   B   C
  /    
 D  E    F

La Performance n'est pas importante et les arbres ne dépasseront pas 1000 éléments.

41
demandé sur Zaz 2009-11-24 07:07:02

3 réponses

'(A (B (D) (E)) (C (F)))
32
répondu Dan 2009-11-26 13:27:26

Il y a une façon effrayante de le faire en utilisant juste cons:

(defn mktree 
  ([label l r] (cons label (cons l r))) 
  ([leaf] (cons leaf (cons nil nil))))
(defn getlabel [t] (first t))
(defn getchildren [t] (rest t))
(defn getleft [t] (first (getchildren t)))
(defn getright [t] (rest (getchildren t)))

Notez que les enfants ne sont pas une liste; c'est une paire. Si vos arbres ne sont pas seulement binaires, vous pouvez en faire une liste. utilisez nil quand il n'y a pas d'enfant gauche ou droit, bien sûr.

Sinon, voir cette réponse.

L'arbre dans votre image:

(mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F)))
5
répondu Jonathan Graehl 2017-05-23 12:17:58

Les arbres sous-tendent à peu près tout dans Clojure parce qu'ils se prêtent si bien au partage structurel dans la structure de données persistante. Les cartes et les vecteurs sont en fait des arbres avec un facteur de ramification élevé pour leur donner une recherche délimitée et un temps d'insertion. Donc, la réponse la plus courte que je puisse donner (bien que ce ne soit pas vraiment utile) est que je recommande vraiment des structures de données purement fonctionnelles par Chris Okasaki pour une vraie réponse à cette question. Aussi la vidéo de Rich Hickey sur Clojure data structures sur blip.tv

(set 'A 'B 'C)
3
répondu Arthur Ulfeldt 2011-10-23 22:20:52