Binary Search Tree
Description
Javascript implementation of a
binary search tree
data structure.
A binary search tree is a rooted binary tree and by definition each node can have at most
two child nodes. A node consists of a key, or value, and a pointer to a left child node
and a pointer a right child node. A node containing no children is called a leaf node.
The main distinction between a binary search tree and a binary tree is that a binary
search tree is sorted. This implies the characteristic that the left child of each node
will be less than its parent, while each right child will be greater than or equal to its
parent.
The major advantage of binary search trees over other data structures is that the related
sorting algorithms and search algorithms such as in order traversal can be very efficient.
This implementation of the binary search tree uses a custom comparator function to
determine the relative ordering of nodes. This function can be provided to the
constructor when instantiating a binary search tree object. A custom function comparator
function is necessary when storing more complex objects. If no comparator function is
provided, the binary search tree will utilize the default comparator function which will
only work on primitive types. See the basic usage section for a specific example.
NOTE: There are NO tree re-balancing capabilities available yet in this
implementation
Environment:
Although this implementation is designed to be used with Node.js,
it could be used in other contexts with minor modifications. This implementation does not
have any external dependencies that would preclude it from being used in the browser--just
include it with a <script>
tag and it should be good to go. Disclaimer: I have not
tested this implementation in any other context/environment; only tested with node.js
Basic Usage (for primitive objects)
Install with npm :
npm install bst-adt --save
var BST = require('bst-adt');
var bst = new BST();
bst.add(7);
bst.add(4);
bst.add(10);
bst.add(3);
bst.add(5);
bst.add(11);
bst.add(9);
console.log(bst.contains(10));
bst.inOrderTraversal(function (key) {
console.log(key);
});
bst.min();
bst.max();
bst.remove(9);
bst.inOrderTraversal(function (key) {
console.log(key);
});
bst.preOrderTraversal(function (key) {
console.log(key);
});
Usage for more complex objects
When using this implementation to store more complex objects, a comparator
function needs to be provided to the constructor when initializing the
binary search tree.
Let's look at an example. Assume there is a 'person' object defined as:
function Person(opts) {
this.name = opts.name || "no name";
this.age = opts.age || null;
}
Assuming we would like to compare the person objects by age, we would define
the comparator function as:
function cmp(a, b) {
return a.age - b.age;
}
Given the above functions, usage of this binary search tree is very similar to
the basic usage with the exception of providing the comparator function to
the person constructor.
var BST = require('bst');
var bst = new BST(cmp);
bst.add( new Person({name: "Alice", age: 40}) );
bst.add( new Person({name: "Bob", age: 32}) );
bst.add( new Person({name: "Charlie", age: 50}) );
bst.add( new Person({name: "Dave", age: 25}) );
bst.add( new Person({name: "Eric", age: 45}) );
bst.inOrderTraversal(function (key) {
console.log(key);
});
console.log(bst.min());
console.log(bst.max());
API
Available methods for a binary search tree instance:
add(value)
Adds a node to the binary search tree containing 'value'
contains(value)
Determines if the binary search tree contains 'value'
inOrderTraversal(callback)
Traverses the binary search tree in order, meaning it will visit
each node in the tree in the order defined by the comparator function.
Typically this is done from smallest to largest value.
The callback function has a signature of function (key) {}
where the key
is value of each node traversed.
preOrderTraversal(callback)
Traverses the binary search tree pre-order, meaning a particular node is
visited before any of its children.
postOrderTraversal(callback)
Traverses the binary search tree post-order, meaning a particlar node is
visited after all of its children have been visited.
min()
Returns the minimum value contained in the binary search tree
max()
Returns the maximum value contained in the binary search tree
remove(key)
Removes the node with key from the binary search tree
License
MIT © Jason Jones