كيف تجعل شجرة البحث الثنائية في كلوجر؟

StackOverflow https://stackoverflow.com/questions/1611157

  •  05-07-2019
  •  | 
  •  

سؤال

في مخطط، يمكنني استخدام define-struct لجعل شجرة البحث الثنائية، ولكن كيف يمكنك أن تفعل ذلك في كلوجر؟

هل كانت مفيدة؟

المحلول

ويمكنك استخدام structmaps. لتعريف واحد:

(defstruct bintree :left :right :key)

لجعل مثيل:

(struct-map bintree :left nil :right nil :key 0)

وبعد ذلك يمكنك الوصول إلى القيم في بنية مثل هذا:

(:left tree)

وغيرها.

وأو يمكنك إنشاء وظائف جديدة استرجاع:

(def left-branch (accessor bintree :left))

واستخدامه:

(left-branch tree)

نصائح أخرى

وأنا لا أعرف كلوجر، ولكن أراهن انها نفس الطريقة التي نفعل ذلك في برنامج بدون define-struct ... سلبيات فقط معا فروع الأيمن والأيسر. للعثور على شيء، RECURSE حتى تصل ذرة.

وعلى محمل الجد، على الرغم من structmaps الصوت مثل ما تريد. لقد وجدت هذه الصفحة . ابحث عن structmaps حوالي نصف الطريق أسفل.

وأبسط طريقة سيكون لاستخدام الشجرة التي تم تعريفها بالفعل في اللغة (كل خريطة مرتبة هي شجرة حقا، إذا كنت فقط بحاجة الى وظيفة مختلفة لمقارنة مفاتيح، واستخدام فرز خريطة من قبل).

;;define function for comparing keys
(defn compare-key-fn [key1 key2] (< key1 key2) )

;;define tree and add elements
(def my-tree
  (->                              ;;syntax sugar
    (sorted-map-by compare-key-fn) ;;this returns empty tree with given function to compare keys
    (assoc 100  "data for key = 100") ;;below we add elements to tree
    (assoc 2  "data for key = 2")
    (assoc 10 "data for key = 10")
    (assoc -2 "data for key = -1")))

;;accesing  elements by key
(prn "element for key 100 =" (my-tree 100))

;;"erasing" elements from tree - in reality, what we are really doing, is returning a new tree that contains all elements of the old one, except the element we've just erased.
(def my-new-tree
  (dissoc my-tree 2))

(prn my-new-tree) ;; to verify, that element 2 is "erased"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top