AVL Trees
Jan Dvořák <mordae@anilinux.org>
(require avl) | package: avl |
A self-balancing binary search tree variant.
All mutations of the AVL tree create new nodes instead of modifying the data in place. The imperative variants change the root node in place for convenience. Mutating the tree is not thread-safe.
These trees could be used for as priority queues with possibility to remove elements from the middle.
1 Creating Trees
procedure
<=? : procedure?
procedure
(make-avleq <=?) → avl?
<=? : procedure?
procedure
(make-avleqv <=?) → avl?
<=? : procedure?
Like hash tables, every AVL tree variant uses a different equality predicate. make-avl uses equal?, make-avleq uses eq? and make-avleqv uses eqv?.
Tree with number? elements would use <= as the comparator, tree with string? elements would use string<=? and so on.
Examples: | ||||||
|
procedure
(make-custom-avl <=? =?) → avl?
<=? : procedure? =? : procedure?
Examples: | |||||||||||||||||
|
Examples: | ||||||
|
2 Predicates
Examples: | ||||||
|
procedure
(avl-equal? v) → boolean?
v : any/c
procedure
v : any/c
procedure
v : any/c
Examples: | ||||||
|
procedure
(avl-empty? tree) → boolean?
tree : avl?
Examples: | ||||
|
procedure
(avl-contains? tree value) → boolean?
tree : avl? value : any/c
Examples: | ||||
|
3 Manipulating Values
Examples: | ||||||
|
Examples: | |||||
|
procedure
(avl-remove tree value) → avl?
tree : avl? value : any/c
Examples: | ||||||
|
procedure
(avl-remove! tree value) → void?
tree : avl? value : any/c
Examples: | |||||
|
4 Queue Usage
Examples: | |||||
|
Examples: | |||||
|
procedure
(avl-pop-min tree) →
any/c avl? tree : avl?
Examples: | ||||||
|
procedure
(avl-pop-min! tree) → any/c
tree : avl?
Examples: | ||||
|
procedure
(avl-pop-max tree) →
any/c avl? tree : avl?
Examples: | ||||||
|
procedure
(avl-pop-max! tree) → any/c
tree : avl?
Examples: | ||||
|
5 Iterating Over Values
Example: | ||||
|
procedure
(in-avl/reverse tree) → sequence?
tree : avl?
Example: | ||||
|
Examples: | ||||
|