[funds-cvs] r6 - trunk/funds/src/trees

abaine at common-lisp.net abaine at common-lisp.net
Mon Jun 11 21:58:22 UTC 2007


Author: abaine
Date: Mon Jun 11 17:58:22 2007
New Revision: 6

Modified:
   trunk/funds/src/trees/avl-tree.lisp
Log:
Initial version of avl-tree.lisp

Modified: trunk/funds/src/trees/avl-tree.lisp
==============================================================================
--- trunk/funds/src/trees/avl-tree.lisp	(original)
+++ trunk/funds/src/trees/avl-tree.lisp	Mon Jun 11 17:58:22 2007
@@ -0,0 +1,85 @@
+
+(in-package :funds)
+
+(defstruct avl
+  height
+  key
+  value
+  left
+  right)
+
+(defun make-avl ()
+  nil)
+
+(defun avl-insert (tree key value)
+  (cond ((null tree) (make-avl :height 1
+			       :key key
+			       :value value
+			       :left nil
+			       :right nil))
+	((< key (avl-key tree)) (left-insert tree))
+	(t (right-insert tree))))
+
+(defun left-insert (tree key value)
+  (let* ((left (avl-insert (avl-left tree)))
+	 (right (avl-right tree)))
+    (if (imbalanced left right)
+	(if (left-heavy left)
+	    (right-rotate left tree right)
+	    (right-rotate (left-rotate left (avl-left left) ) 
+			  tree 
+			  right)
+	    ())
+	(make-avl :height (parent-height left right)
+		  :key (avl-key tree)
+		  :value (avl-value tree)
+		  :left left
+		  :right right))))
+
+(defun right-rotate (b c t3)
+  (let ((a (avl-left b))
+	(new-c (make-avl :height (avl-height c); not sure if this needs to be recalculated
+			 :key (avl-key c)
+			 :value (avl-value c)
+			 :left (avl-right b)
+			 :right t3)))
+    (make-avl :height (parent-height a new-c)
+	      :key (avl-key b)
+	      :value (avl-value b)
+	      :left a
+	      :right new-c)))
+
+(defun left-rotate (t0 a b)
+  (let ((c (avl-right b))
+	(new-a (make-avl :height (avl-height a)
+			 :key (avl-key a)
+			 :value (avl-value a)
+			 :left t0
+			 :right (avl-left b))))
+    (make-avl :height (parent-height (new-a) c)
+	      :key (avl-key b)
+	      :value (avl-value b)
+	      :left new-a
+	      :right c)))
+
+(defun imbalanced (left right)
+  (> (abs (- (height right) (height left)))
+     1))
+
+(defun left-heavy (tree)
+  (< (balance-factor tree) 0))
+
+(defun right-heavy (tree)
+  (> (balance-factor tree) 0))
+
+(defun right-insert (tree key value)
+  ())
+
+(defun balance-factor (tree)
+  (- (height (avl-right tree))
+     (height (avl-left tree))))
+
+(defun height (tree)
+  (if (null tree)
+      0
+      (avl-height tree)))



More information about the Funds-cvs mailing list