[funds-cvs] r56 - trunk/funds/src/trees
abaine at common-lisp.net
abaine at common-lisp.net
Thu Jul 5 02:59:25 UTC 2007
Author: abaine
Date: Wed Jul 4 22:59:25 2007
New Revision: 56
Added:
trunk/funds/src/trees/binary-tree.lisp
Log:
Added binary-tree.lisp.
Added: trunk/funds/src/trees/binary-tree.lisp
==============================================================================
--- (empty file)
+++ trunk/funds/src/trees/binary-tree.lisp Wed Jul 4 22:59:25 2007
@@ -0,0 +1,83 @@
+
+(in-package :funds)
+
+(defstruct bt
+ key
+ value
+ left
+ right)
+
+(defun make-empty-bt ()
+ nil)
+
+(defun bt-empty-p (tree)
+ (null tree))
+
+(defun bt-insert (tree key value &key (order #'<) (test #'eql))
+ (cond ((bt-empty-p tree) (make-bt :key key
+ :value value
+ :left (make-empty-bt)
+ :right (make-empty-bt)))
+ ((funcall test key (bt-key tree)) (make-bt :key key
+ :value value
+ :left (bt-left tree)
+ :right (bt-right tree)))
+
+ ((funcall order key (bt-key tree))
+ (make-bt :key (bt-key tree)
+ :value (bt-value tree)
+ :left (bt-insert (bt-left tree) key value :order order :test test)
+ :right (bt-right tree)))
+ (t (make-bt :key (bt-key tree)
+ :value (bt-value tree)
+ :left (bt-left tree)
+ :right (bt-insert (bt-right tree)key value :order order :test test)))))
+
+(defun bt-find (tree key &key (order #'<) (test #'eql))
+ (cond ((bt-empty-p tree) (values nil nil))
+ ((funcall test key (bt-key tree)) (values (bt-value tree) t))
+ ((funcall order key (bt-key tree)) (bt-find (bt-left tree) key
+ :order order
+ :test test))
+ (t (bt-find (bt-right tree) key
+ :order order
+ :test test))))
+
+(defun bt-remove (tree key &key (order #'<) (test #'eql))
+ (cond ((bt-empty-p tree) tree)
+ ((funcall test key (bt-key tree)) (remove-root tree :order order :test test))
+ ((funcall order key (bt-key tree)) (make-bt :key (bt-key tree)
+ :value (bt-value tree)
+ :left (bt-remove (bt-left tree) key
+ :order order
+ :test test)
+ :right (bt-right tree)))
+ (t (make-bt :key (bt-key tree)
+ :value (bt-value tree)
+ :left (bt-left tree)
+ :right (bt-remove (bt-right tree) key
+ :order order
+ :test test)))))
+
+(defun remove-root (tree &key order test)
+ (cond ((bt-empty-p (bt-left tree)) (bt-right tree))
+ ((bt-empty-p (bt-right tree)) (bt-left tree))
+ (t (let* ((next (next-in-order (bt-right tree) order))
+ (k (bt-key next)))
+ (make-bt :key k
+ :value (bt-value next)
+ :left (bt-left tree)
+ :right (bt-remove (bt-right tree) k
+ :order order
+ :test test))))))
+
+(defun bt->alist (tree)
+ (if (bt-empty-p tree) nil
+ (append (bt->alist (bt-left tree))
+ (cons (cons (bt-key tree) (bt-value tree))
+ (bt->alist (bt-right tree))))))
+
+(defun next-in-order (tree order)
+ (if (bt-empty-p (bt-left tree))
+ tree
+ (next-in-order (bt-left tree) order)))
\ No newline at end of file
More information about the Funds-cvs
mailing list