1.0.0 • Published 3 years ago

asmscript_2 v1.0.0

Weekly downloads
-
License
ISC
Repository
-
Last release
3 years ago

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

OperationComplexity
containsO(log n)
deleteO(log n)
findMaximumO(log n)
findMinimumO(log n)
getO(log n)
insertO(log n)
isEmptyΘ(1)
sizeΘ(1)
1.0.0

3 years ago