as-avl-tree

1.6.3 • Public • Published

An AssemblyScript implementation of the AVL tree data structure (port of ts-avl-tree).

Features

  • 100% test coverage
  • Supports all common tree operations
  • Store keys with optional associated values
  • Optional custom compare function that can utilize both key and value to give full control over the order of the data

Install

npm install --save @tyriar/avl-tree

Usage

See the typings file for the full API.

// Import npm module
import { AvlTree } from "@tyriar/avl-tree";

// Construct AvlTree
const tree = new AvlTree<i32>();

// Insert keys
tree.insert(1);
tree.insert(2);
tree.insert(3);
tree.insert(4);
tree.insert(5);
console.log("size: " + tree.size);
console.log("contains 2: " + tree.contains(2));
console.log("contains 7: " + tree.contains(7));
// > size: 5
// > contains 2: true
// > contains 7: false

// Delete a key
tree.delete(2);
console.log("size: " + tree.size);
console.log("contains 2: " + tree.contains(2));
// > size: 4
// > contains 2: false

// Construct custom compare AvlTree
const tree2 = new AvlTree<string, string>(function (a, b) {
  return a.localeCompare(b);
});
tree2.insert("a");
tree2.insert("A");
tree2.insert("b");
tree2.insert("B");

// Delete the minimum key
const minKey = tree2.findMinimum();
tree2.delete(minKey);
console.log("minKey: " + minKey);
console.log("new minKey: " + tree2.findMinimum());
// > min key: 'a'
// > new min key: 'A'

AssemblySCript quirks

Note that these AvlTree and AvlTreeMap implementation have the same limitation as the implementation of Map in the AssemblyScript stdlib: namely, because undefined cannot be represented and (not all types are nullable)[https://www.assemblyscript.org/types.html#nullability], using .get on a missing key will result in an error, as will using .findMinimum() and .findMaximum() on an empty tree.

Therefore, one must unfortuntately do a manual validity check when using these methods, similar to what is required for Map, for example:

var tree = new AvlTreeMap<i32, string>();

var str = tree.get(1); // ERROR
var minStr = tree.findMinimum(); // ERROR

// The error can be avoided by first doing a validity check:
var str: string | null = tree.has(1) ? tree.get(1) : null; // OK
var str: string | null = tree.isEmpty() ? tree.findMinimum() : null; // OK

// Note that if the values in an AvlTreeMap are of a non-nullable
// type (such as numeric types) you'll need to expand the conditional,
// because a one-liner like the ones above won't compile

var tree = new AvlTreeMap<i32, f64>();
// `f64 | null` is not a valid type
var num: f64 | null = tree.has(1) ? tree.get(1) : null; // ERROR

Operation time complexity

Operation Complexity
contains O(log n)
delete O(log n)
findMaximum O(log n)
findMinimum O(log n)
get O(log n)
insert O(log n)
isEmpty Θ(1)
size Θ(1)

Dependencies (1)

Dev Dependencies (5)

Package Sidebar

Install

npm i as-avl-tree

Weekly Downloads

1

Version

1.6.3

License

MIT

Unpacked Size

60.1 kB

Total Files

32

Last publish

Collaborators

  • b----c