The active repository is at https://codeberg.org/glv/bst
BST is a Common Lisp library for working with binary search trees that can contain any kind of values.
BST is released under the GPL-3 license. See the LICENSE file for details.
By default, the library is set to work with trees containing numbers.
To work with another type of values, the parameters
*bst-copy-function*, *bst-equal-p-function* and
*bst-lesser-p-function* must be set or bound.
*bst-copy-function* must be a function used to make a copy of a value
(identity by default).
*bst-equal-p-function* must be a function used to check if two values of
a tree are equal (= by default).
*bst-lesser-p-function* must be a function used to check if a value of a tree
is lesser than another (< by default).
(bst-copy value) => valueMake a copy of value using *bst-copy-function*.
(bst-equal-p value1 value2) => booleanCheck if value1 and value2 are equal using *bst-equal-p-function*.
(bst-lesser-p value1 value2) => booleanCheck if value1 is lesser than value2 using *bst-lesser-p-function*.
+bst-empty++bst-empty+ represents the empty tree.
(bst-empty-p tree) => booleanCheck wether a tree is empty or not.
(bst-add tree value) => tree
(bst-add! tree value) => treeInsert a value in a tree. If the value is already in the tree, the
insertion has no effect (duplicates are discarded). The tree returned by
bst-add will share as much of its structure as possible with the tree
passed in argument to reduce memory allocations. bst-add! is the destructive
version of bst-add (it can modify parts of the tree passed as argument in
place to build the returned tree).
(bst-from-values values) => treeBuild a tree containing the values passed as argument. values must
be a sequence. bst-from-values uses bst-add! to build the tree.
(bst-from-sorted-values values) => treeBuild a balanced tree containing the values passed as argument.
values must be a vector. bst-from-sorted-values uses bst-add! to
build the tree. (bst-from-sorted-values values) is equivalent to
(bst-balance! (bst-from-values values)), but more efficient.
(bst-remove tree value) => tree
(bst-remove! tree value) => treeRemove a value from a tree. The tree returned by bst-remove will share as
much of its structure as possible with the tree passed in argument to reduce
memory allocations. bst-remove! is the destructive version of bst-remove
(it can modify parts of the tree passed as argument in place to build the
returned tree).
(bst-balance tree) => treeBalance a tree to make searches more efficient.
(bst-search tree value) => value, value-pSearch a value in a tree. The first returned value is value if
it was found in the tree and nil otherwise. The second returned
value is t if the value was found and nil otherwise.
(bst-max-value tree) => value, value-p
(bst-min-value tree) => value, value-pSearch the maximum or minimum value in a tree. The first returned
value is the found maximum or minimum, or nil it the tree is
empty. The second returned value is nil if the tree is empty
and t otherwise.
(bst-search-max-value-below tree value) => value, value-pSearch the maximum value in a tree that is lesser than a given value. If
such a value is found, the function returns it and t. Otherwise the function
returns nil and nil.
(bst-search-min-value-above tree value) => value, value-pSearch the minimum value in a tree that is greater than a given value. If
such a value is found, the function returns it and t. Otherwise the function
returns nil and nil.
(bst-count tree) => integerReturn the number of values in a tree.
(bst-max-depth tree) => integer
(bst-min-depth tree) => integerReturn the maximum or minimum depth of leaf nodes in a tree.
(bst-tree-copy tree) => treeMake a copy of a tree.
(bst-tree-equal-p tree1 tree2) => booleanCheck if two trees have the same structure (nodes and edges).
(bst-values tree) => vectorReturn a vector containing the sorted values of a tree.
(bst-values-equal-p tree1 tree2) => booleanCheck if two trees contain the same values (even if they have different structures).
(bst-map tree function) => nilApply a function to each value in a tree in ascending order. Note that the results of applying the function to the values are not collected. If you need to keep them, your function must take care of that.
Tree using integer values:
(defvar tree (bst:bst-from-values '(1 2 3 4)))
(setf tree (bst:bst-add tree 5))
(setf tree (bst:bst-remove tree 3))
(bst:bst-search tree 2)
2
T
(bst:bst-search tree 3)
NIL
NILTree using string values:
(let* ((bst:*bst-copy-function* #'copy-seq)
(bst:*bst-equal-p-function* #'string=)
(bst:*bst-lesser-p-function* #'string<)
(tree (bst:bst-balance (bst:bst-from-values '("one" "two" "three")))))
(bst:bst-count tree))
3The tests require the FiveAM package. They can be run with:
(asdf:test-system "bst")