Author: abaine
Date: Wed Jun 20 18:27:13 2007
New Revision: 35
Modified:
trunk/funds/src/trees/avl-tree.lisp
Log:
Rearranged avl-tree.lisp to put public interface at top.
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 20 18:27:13 2007
@@ -1,12 +1,8 @@
(in-package :funds.trees)
-(defstruct avl
- ht
- key
- value
- left
- right)
+;;;; Public Interface
+
(defun empty-avl-tree ()
"An empty AVL Tree."
@@ -37,6 +33,32 @@
((funcall order key (avl-key tree)) (left-insert tree key value test order))
(t (right-insert tree key value test order))))
+(defun avl-find-value (tree key &key (order #'<) (test #'eql))
+ "The value associated with the given key in the given AVL Tree. The function
+returns nil if the key is not found in the given tree; a second value is returned
+to indicate whether nil is returned because it is in fact the value associated with
+the given key or, instead, the key could not be found."
+ (cond ((avl-empty-p tree) (values nil nil))
+ ((funcall test key (avl-key tree)) (values (avl-value tree) t))
+ ((funcall order key (avl-key tree))
+ (avl-find-value (avl-left tree) key :order order :test test))
+ (t (avl-find-value (avl-right tree) key :order order :test test))))
+
+(defstruct avl
+ ht
+ key
+ value
+ left
+ right)
+
+(defun avl-height (tree)
+ "The height of the given AVL Tree."
+ (if (avl-empty-p tree)
+ 0
+ (avl-ht tree)))
+
+;;;; Insertion Helpers
+
(defun left-insert (tree key value test order)
"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
@@ -77,6 +99,8 @@
:left left
:right right))))
+;;;; Rotation Functions
+
(defun left-rotate (t0 a b)
(let ((c (avl-right b))
(new-a (make-avl :ht (1- (avl-ht a)) ; re-calculate?
@@ -103,16 +127,7 @@
:left a
:right new-c)))
-(defun avl-find-value (tree key &key (order #'<) (test #'eql))
- "The value associated with the given key in the given AVL Tree. The function
-returns nil if the key is not found in the given tree; a second value is returned
-to indicate whether nil is returned because it is in fact the value associated with
-the given key or, instead, the key could not be found."
- (cond ((avl-empty-p tree) (values nil nil))
- ((funcall test key (avl-key tree)) (values (avl-value tree) t))
- ((funcall order key (avl-key tree))
- (avl-find-value (avl-left tree) key :order order :test test))
- (t (avl-find-value (avl-right tree) key :order order :test test))))
+;;;; AVL Tree utility functions
(defun imbalanced (left right)
"Whether the heights of the given sub-trees differ,
@@ -128,12 +143,6 @@
"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."
@@ -151,7 +160,7 @@
(avl-left tree)))
(defun parent-height (left right)
- "The height of the parent of the given sub-trees."
+ "The height the tree should be, whose children are the given sub-trees."
(let ((a (avl-height left))
(b (avl-height right)))
(1+ (if (> a b) a b))))