[funds-cvs] r10 - trunk/funds/src/trees
abaine at common-lisp.net
abaine at common-lisp.net
Thu Jun 14 02:07:48 UTC 2007
Author: abaine
Date: Wed Jun 13 22:07:48 2007
New Revision: 10
Modified:
trunk/funds/src/trees/avl-tree.lisp
Log:
Added comments and fixed problem with right-rotate.
Modified: trunk/funds/src/trees/avl-tree.lisp
==============================================================================
--- trunk/funds/src/trees/avl-tree.lisp (original)
+++ trunk/funds/src/trees/avl-tree.lisp Wed Jun 13 22:07:48 2007
@@ -1,29 +1,35 @@
-(in-package :funds)
+(in-package :funds-trees)
(defstruct avl
- height
+ ht
key
value
left
right)
-(defun make-avl-tree ()
+(defun empty-avl-tree ()
+ "An empty AVL Tree."
nil)
+(defun avl-empty-p (tree)
+ "Whether the given AVL Tree is empty:
+t if it is empty; nil else."
+ (null tree))
+
(defun avl-insert (tree key value)
- (cond ((avl-empty tree) (make-avl :height 1
- :key key
- :value value
- :left nil
- :right nil))
+ (cond ((avl-empty-p tree) (make-avl :ht 1
+ :key key
+ :value value
+ :left nil
+ :right nil))
((< key (avl-key tree)) (left-insert tree key value))
(t (right-insert tree key value))))
-(defun avl-empty (tree)
- (null tree))
-
(defun left-insert (tree key value)
+ "The AVL tree that results when the given key-value pair is inserted
+into left sub-tree of the given AVL tree. Only non-empty avl-trees
+should be supplied as arguments."
(let ((left (avl-insert (avl-left tree) key value))
(right (avl-right tree)))
(if (imbalanced left right)
@@ -34,22 +40,27 @@
(avl-right left))
tree
right))
- (make-avl :height (parent-height left right)
+ (make-avl :ht (parent-height left right)
:key (avl-key tree)
:value (avl-value tree)
:left left
:right right))))
(defun right-insert (tree key value)
+ "The AVL tree that results when the given key-value pair is inserted
+into the right sub-tree of the given AVL tree. Only non-empty avl-trees
+should be supplied as the tree argument."
(let ((right (avl-insert (avl-right tree) key value))
(left (avl-left tree)))
(if (imbalanced left right)
(if (right-heavy right)
(left-rotate left tree right)
- (left-rotate (right-rotate (avl-right right)
+ (left-rotate left
+ tree
+ (right-rotate (avl-left right)
right
- (avl-left right))))
- (make-avl :height (parent-height left right)
+ (avl-right right))))
+ (make-avl :ht (parent-height left right)
:key (avl-key tree)
:value (avl-value tree)
:left left
@@ -57,12 +68,12 @@
(defun left-rotate (t0 a b)
(let ((c (avl-right b))
- (new-a (make-avl :height (1- (avl-height a)) ; re-calculate?
+ (new-a (make-avl :ht (1- (avl-ht a)) ; re-calculate?
:key (avl-key a)
:value (avl-value a)
:left t0
:right (avl-left b))))
- (make-avl :height (1+ (avl-height new-a))
+ (make-avl :ht (1+ (avl-ht new-a))
:key (avl-key b)
:value (avl-value b)
:left new-a
@@ -70,37 +81,50 @@
(defun right-rotate (b c t3)
(let ((a (avl-left b))
- (new-c (make-avl :height (1- (avl-height c)); re-calculate?
+ (new-c (make-avl :ht (1- (avl-ht c)); re-calculate?
:key (avl-key c)
:value (avl-value c)
:left (avl-right b)
:right t3)))
- (make-avl :height (1+ (avl-height new-c)) ; re-calculate?
+ (make-avl :ht (1+ (avl-ht new-c)) ; re-calculate?
:key (avl-key b)
:value (avl-value b)
:left a
:right new-c)))
(defun imbalanced (left right)
- (> (abs (- (height right) (height left)))
- 1))
+ "Whether the heights of the given sub-trees differ,
+in their absolute values, by more than one."
+ (> (abs (height-difference left right)) 1))
+
+(defun height-difference (a b)
+ "The difference in heights of the given sub-trees."
+ (- (avl-height a) (avl-height b)))
+
+(defun avl-height (tree)
+ "The height of the given AVL Tree."
+ (if (avl-empty-p tree)
+ 0
+ (avl-ht tree)))
(defun left-heavy (tree)
+ "Whether the given imbalanced AVL Tree has a left sub-tree
+taller than its right sub-tree."
(< (balance-factor tree) 0))
(defun right-heavy (tree)
+ "Whether the given imbalanced AVL Tre has a right sub-tree
+taller than its left sub-tree."
(> (balance-factor tree) 0))
(defun balance-factor (tree)
- (- (height (avl-right tree))
- (height (avl-left tree))))
-
-(defun height (tree)
- (if (null tree)
- 0
- (avl-height tree)))
+ "The difference in heights of the right sub-tree and left
+sub-tree of the given AVL Tree."
+ (height-difference (avl-right tree)
+ (avl-left tree)))
(defun parent-height (left right)
- (let ((a (height left))
- (b (height right)))
+ "The height of the parent of the given sub-trees."
+ (let ((a (avl-height left))
+ (b (avl-height right)))
(1+ (if (> a b) a b))))
More information about the Funds-cvs
mailing list