;;; Commentary:
-;; This file combines elib-node.el and avltree.el from Elib.
-;;
-;; * Comments from elib-node.el
-;; A node is implemented as an array with three elements, using
-;; (elt node 0) as the left pointer
-;; (elt node 1) as the right pointer
-;; (elt node 2) as the data
-;;
-;; Some types of trees, e.g. AVL trees, need bigger nodes, but
-;; as long as the first three parts are the left pointer, the
-;; right pointer and the data field, these macros can be used.
-;;
-;; * Comments from avltree.el
;; An AVL tree is a nearly-perfect balanced binary tree. A tree
;; consists of two cons cells, the first one holding the tag
;; 'AVL-TREE in the car cell, and the second one having the tree
;; sub-tree and one right sub-tree. Each node also has a balance
;; count, which is the difference in depth of the left and right
;; sub-trees.
+;;
+;; The "public" functions (prefixed with "avl-tree") are:
+;; -create, -p, -compare-function, -empty, -enter, -delete,
+;; -member, -map, -first, -last, -copy, -flatten, -size, -clear.
;;; Code:
`(aset ,node 2 ,newdata))
(defmacro avl-tree-node-branch (node branch)
- ;; Get value of a branch of a node.
- ;;
- ;; NODE is the node, and BRANCH is the branch.
- ;; 0 for left pointer, 1 for right pointer and 2 for the data."
+ "Get value of a branch of a node.
+
+NODE is the node, and BRANCH is the branch.
+0 for left pointer, 1 for right pointer and 2 for the data.\""
`(aref ,node ,branch))
(defmacro avl-tree-node-set-branch (node branch newval)
- ;; Set value of a branch of a node.
- ;;
- ;; NODE is the node, and BRANCH is the branch.
- ;; 0 for left pointer, 1 for the right pointer and 2 for the data.
- ;; NEWVAL is new value of the branch."
+ "Set value of a branch of a node.
+
+NODE is the node, and BRANCH is the branch.
+0 for left pointer, 1 for the right pointer and 2 for the data.
+NEWVAL is new value of the branch.\""
`(aset ,node ,branch ,newval))
(defmacro avl-tree-node-balance (node)
go-left nil))))))
(defun avl-tree-do-copy (root)
- ;; Copy the tree with ROOT as root.
+ ;; Copy the avl tree with ROOT as root.
;; Highly recursive. INTERNAL USE ONLY.
(if (null root)
nil
;;; The public functions which operate on AVL trees.
(defun avl-tree-create (compare-function)
- "Create an empty avl tree.
+ "Create a new empty avl tree and return it.
COMPARE-FUNCTION is a function which takes two arguments, A and B,
and returns non-nil if A is less than B, and nil otherwise."
(cons 'AVL-TREE
(eq (car-safe obj) 'AVL-TREE))
(defun avl-tree-compare-function (tree)
- "Return the comparision function for the avl tree TREE."
+ "Return the comparison function for the avl tree TREE."
(avl-tree-cmpfun tree))
(defun avl-tree-empty (tree)
- "Return t if TREE is emtpy, otherwise return nil."
+ "Return t if avl tree TREE is emtpy, otherwise return nil."
(null (avl-tree-root tree)))
(defun avl-tree-enter (tree data)
(defun avl-tree-delete (tree data)
"From the avl tree TREE, delete DATA.
-Return the element in TREE which matched DATA, nil if no element matched."
+Return the element in TREE which matched DATA,
+nil if no element matched."
(avl-tree-do-delete (avl-tree-cmpfun tree)
(avl-tree-dummyroot tree)
0
(defun avl-tree-member (tree data)
"Return the element in the avl tree TREE which matches DATA.
-Matching uses the compare function previously specified in `avl-tree-create'
-when TREE was created.
+Matching uses the compare function previously specified in
+`avl-tree-create' when TREE was created.
If there is no such element in the tree, the value is nil."
(let ((node (avl-tree-root tree))
nil)))
(defun avl-tree-map (__map-function__ tree)
- "Apply MAP-FUNCTION to all elements in the avl tree TREE."
+ "Apply __MAP-FUNCTION__ to all elements in the avl tree TREE."
(avl-tree-mapc
(function (lambda (node)
(avl-tree-node-set-data