can-binarytree extends the very well written JavaScript binary tree implementations provided by @vadimg and mixes in features of CanJS that make the data structures observable.
Use npm to install can-binarytree
:
npm install can-binarytree --save
Use require
in Node/Browserify workflows to import can-binarytree
like:
require('can');
require('can-binarytree');
Use define
, require
or import
in StealJS
workflows to import can-binarytree
like:
import 'can';
import 'can-binarytree';
Once you've imported can-binarytree
into your project, use it to
create observable binary tree data structures. The following example
console.log
's some metadata about each node that's added to a
can.RBTreeList
:
var tree = new can.RBTreeList();
tree.bind('add', function (ev, nodes) {
console.log(node[0]);
})
tree.push('Hop'); // Node {id: 0, parent: null, data: "Hop", left: null, right: null...}
tree.push('Skip'); // Node {id: 2, parent: Node, data: "Skip", left: null, right: null...}
tree.push('Jump'); // Node {id: 4, parent: Node, data: "Jump", left: null, right: null...}
- RBTreeList - A red-black tree implementation that meets the specifications of a can.List
- RBTree - A self-balancing binary tree that serves as a key-value store
- BinTree - A binary tree that is not balanced
Note: Currently the only data structure in the package that is observable is
the can.RBTreeList
.
A red-black tree that uses a numeric "index" as the "key" in the same way
a can.List
or native Javascript array might, yet still performs insert and
remove operations in O(log n)
time.
rbTreeList.attr() -> Array
Returns an array of all the nodes' data
property value in the
can.RBTreeList
.
rbTreeList.attr(index) -> Object
Returns the data
stored on the node in the can.RBTreeList
at
the specified index.
rbTreeList.attr(index, value) -> can.RBTreeList
Creates a node, sets its data
property, and inserts it into the
can.RBTreeList
at the specified index. If a node already exists at
the specified index its data
property is overwritten with the
specified value.
Returns the can.RBTreeList
.
rbTreeList.attr('length') -> can.RBTreeList
Returns the length
of the can.RBTreeList
.
rbTreeList.batchSet(array, setFn) -> can.RBTreeList
Populates an empty can.RBTreeList
in O(n)
time - compared
to O(mlogn)
time - from an array of values.
The setFn
is invoked for each insert with two arguments:
(insertIndex, createdNode)
Returns the can.RBTreeList
.
rbTreeList.deleteAttr(index) -> Object
Removes the node at the specified index
without affecting the length
of
the RBTreeList
in the same way that the delete operator
affects a Javascript array. The resulting index
will not
be iterable with .each()
until it is set or removed.
Returns the value of the node's data
property that was removed.
rbTreeList.each(callbackFn) -> can.RBTreeList
Iterates over the nodes in the can.RBTreeList
invoking callbackFn
for each
node's data
property. The callbackFn
is invoked with two arguments:
(value, index). If the callback returns false
, the iteration will stop.
rbTreeList.eachNode(callbackFn) -> can.RBTreeList
Iterates over the nodes in the can.RBTreeList
invoking callbackFn
for each
node. The callbackFn
is invoked with two arguments: (node, index).
If the callback returns false
, the iteration will stop.
rbTreeList.filter(predicateFn, context) -> can.RBTreeList
Iterates the elements in the can.RBTreeList
returning a new
can.RBTreeList
instance of all elements prediateFn
returns truthy for.
The predicateFn
is invoked in the specified context
with the arguments:
(value, index, rbTreeList).
Returns a new can.RBTreeList
instance.
rbTreeList.indexOf(value) -> Number
Returns the first index at which the specified value
can be found in
the can.RBTreeList
, or -1 if it is not present.
rbTreeList.indexOfNode(node, useCache) -> Number
Returns the first index at which the specified node
can be found in
the can.RBTreeList
, or -1 if it is not present.
rbTreeList.map(mapFn, context) -> can.RBTreeList
Creates an can.RBTreeList
of values by running each element in the
can.RBTreeList
through mapFn
. The iteratee is invoked in the specified
context
with three arguments: (value, index, rbTreeList).
Returns a new can.RBTreeList
instance.
rbTreeList.push(value) -> Number
Inserts the specified value at the end of the can.RBTreeList
.
Returns the length
of the can.RBTreeList
.
rbTreeList.removeAttr(index) -> Object
Removes the node at the specified index
and decrements the length
of
the RBTreeList
by 1.
Returns the value of the node's data
property that was removed.
rbTreeList.replace(newValues) -> can.RBTreeList
Changes the content of a can.RBTreeList
by removing all of the existing nodes
and inserting new nodes with the values supplied in the newValues
array.
Returns the can.RBTreeList
.
rbTreeList.splice(startIndex, removeCount, nodes...) -> Array
Changes the content of a can.RBTreeList
by removing existing nodes
and/or adding new nodes.
Returns an array of nodes removed from the can.RBTreeList
.
rbTreeList.unshift(value) -> Number
Inserts the specified value at the beginning of the can.RBTreeList
.
Returns the length
of the can.RBTreeList
.
A reference to the Node
constructor used internally by can.RBTreeList
to
create nodes.
Coming soon
Coming soon
Coming soon