diff --git a/CHANGELOG.md b/CHANGELOG.md index 6335338..8162244 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] + +## [4.2.0] - 2021-06-19 + +### Added +- typescript. + ## [4.1.1] - 2021-05-29 ### Fixed diff --git a/README.md b/README.md index 8bcdc47..0a481b3 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ Binary Search Tree & AVL Tree (Self Balancing Tree) implementation in javascript. + + @@ -21,12 +23,12 @@ Binary Search Tree & AVL Tree (Self Balancing Tree) implementation in javascript
Binary Search Tree
-# Table of Contents +# Contents * [Install](#install) +* [require](#require) +* [import](#import) * [API](#api) - * [require](#require) - * [import](#import) - * [new](#new) + * [constructor](#constructor) * [.insert(key, value)](#insertkey-value) * [.has(key)](#haskey) * [.find(key)](#findkey) @@ -41,8 +43,8 @@ Binary Search Tree & AVL Tree (Self Balancing Tree) implementation in javascript * [.traversePostOrder(cb)](#traversepostordercb) * [.remove(key)](#removekey) * [.clear()](#clear) - * [BinarySearchTreeNode](#binarysearchtreenode) - * [AvlTreeNode](#avltreenode) + * [BinarySearchTreeNode](#binarysearchtreenodet-u) + * [AvlTreeNode](#avltreenodet-u) * [Build](#build) * [License](#license) @@ -51,8 +53,6 @@ Binary Search Tree & AVL Tree (Self Balancing Tree) implementation in javascript npm install --save @datastructures-js/binary-search-tree ``` -## API - ### require ```js @@ -74,8 +74,11 @@ import { } from '@datastructures-js/binary-search-tree'; ``` -### new +## API + +### constructor +##### JS ```js const bst = new BinarySearchTree(); ``` @@ -85,7 +88,18 @@ const bst = new BinarySearchTree(); const bst = new AvlTree(); ``` -### .insert(key, value) +##### TS +```js +// BinarySearchTree +const bst = new BinarySearchTree(); +``` + +```js +// AvlTree +const bst = new AvlTree(); +``` + +### .insert(key[, value]) inserts a node with key/value into the tree and returns the inserted node. Inserting an node with existing key, will update the existing node's value with the new one. @@ -97,11 +111,11 @@ inserts a node with key/value into the tree and returns the inserted node. Inser - key: number | string + key: T (number | string)
- value: any + value: U - BinarySearchTreeNode | AvlTreeNode + BinarySearchTreeNode<T, U> | AvlTreeNode<T, U> O(log(n)) @@ -127,7 +141,7 @@ checks if a node exists by its key. - key: number | string + key: T (number | string) boolean O(log(n)) @@ -150,9 +164,9 @@ finds a node in the tree by its key. - key: number | string + key: T (number | string) - BinarySearchTreeNode | AvlTreeNode + BinarySearchTreeNode<T, U> | AvlTreeNode<T, U> O(log(n)) @@ -174,7 +188,7 @@ finds the node with min key in the tree. runtime - BinarySearchTreeNode | AvlTreeNode + BinarySearchTreeNode<T, U> | AvlTreeNode<T, U> O(log(n)) @@ -194,7 +208,7 @@ finds the node with max key in the tree. runtime - BinarySearchTreeNode | AvlTreeNode + BinarySearchTreeNode<T, U> | AvlTreeNode<T, U> O(log(n)) @@ -215,8 +229,8 @@ finds the node with the biggest key less or equal a given value k. runtime - k: number | string - BinarySearchTreeNode | AvlTreeNode + k: T (number | string) + BinarySearchTreeNode<T, U> | AvlTreeNode<T, U> O(log(n)) @@ -236,8 +250,8 @@ finds the node with the smallest key bigger than a given value k. runtime - k: number | string - BinarySearchTreeNode | AvlTreeNode + k: T (number | string) + BinarySearchTreeNode<T, U> | AvlTreeNode<T, U> O(log(n)) @@ -256,7 +270,7 @@ returns the root node of the tree. runtime - BinarySearchTreeNode | AvlTreeNode + BinarySearchTreeNode<T, U> | AvlTreeNode<T, U> O(1) @@ -294,7 +308,7 @@ traverses the tree in order (left-node-right). runtime - cb: function + cb: (node: BinarySearchTreeNode<T, U> | AvlTreeNode<T, U>) => void O(n) @@ -322,7 +336,7 @@ traverses the tree pre order (node-left-right). runtime - cb: function + cb: (node: BinarySearchTreeNode<T, U> | AvlTreeNode<T, U>) => void O(n) @@ -350,7 +364,7 @@ traverses the tree post order (left-right-node). runtime - cb: function + cb: (node: BinarySearchTreeNode<T, U> | AvlTreeNode<T, U>) => void O(n) @@ -379,7 +393,7 @@ removes a node from the tree by its key. AVL tree will rotate nodes properly if runtime - key: number | string + key: T boolean O(log(n)) @@ -409,41 +423,41 @@ console.log(bst.count()); // 0 console.log(bst.root()); // null ``` -### BinarySearchTreeNode +### BinarySearchTreeNode<T, U> #### .getKey() - +
return
number | string
T (number | string)
#### .setValue(value) - +
params
value: any
value: U
#### .getValue() - +
return
any
U
#### .setLeft(left) - +
params
left: BinarySearchTreeNode | null
left: BinarySearchTreeNode<T, U>
#### .getLeft() - +
return
BinarySearchTreeNode | null
BinarySearchTreeNode<T, U>
#### .hasLeft() @@ -457,14 +471,14 @@ console.log(bst.root()); // null - +
params
right: BinarySearchTreeNode | null
right: BinarySearchTreeNode<T, U>
#### .getRight() - +
return
BinarySearchTreeNode | null
BinarySearchTreeNode<T, U>
#### .hasRight() @@ -478,14 +492,14 @@ console.log(bst.root()); // null - +
params
parent: BinarySearchTreeNode | null
parent: BinarySearchTreeNode<T, U>
#### .getParent() - +
return
BinarySearchTreeNode | null
BinarySearchTreeNode<T, U>
#### .hasParent() @@ -509,15 +523,15 @@ console.log(bst.root()); // null boolean -### AvlTreeNode -extends BinarySearchTreeNode and adds the following methods: +### AvlTreeNode<T, U> +extends BinarySearchTreeNode<T, U> and adds the following methods: #### .rotateLeft() Rotates self left (counter-clockwise). - +
return
AvlTreeNode
AvlTreeNode<T, U>
#### .rotateRight() @@ -525,7 +539,7 @@ Rotates self right (clockwise). - +
return
AvlTreeNode
AvlTreeNode<T, U>
#### .rotateLeftRight() @@ -533,7 +547,7 @@ Rotates left child to left then self to right. - +
return
AvlTreeNode
AvlTreeNode<T, U>
#### .rotateRightLeft() @@ -541,7 +555,7 @@ Rotates right child to right then self to left. - +
return
AvlTreeNode
AvlTreeNode<T, U>
#### .getHeight() diff --git a/index.js b/index.js index e480c84..42801e1 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ -const BinarySearchTreeNode = require('./src/binarySearchTreeNode'); -const AvlTreeNode = require('./src/avlTreeNode'); +const { BinarySearchTreeNode } = require('./src/binarySearchTreeNode'); +const { AvlTreeNode } = require('./src/avlTreeNode'); const BinarySearchTree = require('./src/binarySearchTree'); const AvlTree = require('./src/avlTree'); diff --git a/package.json b/package.json index aef13f4..bd631e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datastructures-js/binary-search-tree", - "version": "4.1.1", + "version": "4.2.0", "description": "binary search tree & avl tree (self balancing tree) implementation in javascript", "main": "index.js", "scripts": { diff --git a/src/avlTree.d.ts b/src/avlTree.d.ts new file mode 100644 index 0000000..a750723 --- /dev/null +++ b/src/avlTree.d.ts @@ -0,0 +1,15 @@ +import { BinarySearchTree } from './binarySearchTree'; +import { AvlTreeNode } from './avlTreeNode'; + +export class AvlTree extends BinarySearchTree { + insert(key: T, value: U): AvlTreeNode; + find(key: T): AvlTreeNode; + max(node?: AvlTreeNode): AvlTreeNode; + min(node?: AvlTreeNode): AvlTreeNode; + lowerBound(k: T, node?: AvlTreeNode): AvlTreeNode; + upperBound(k: T, node?: AvlTreeNode): AvlTreeNode; + root(): AvlTreeNode; + traverseInOrder(cb: (node: AvlTreeNode) => void): void; + traversePreOrder(cb: (node: AvlTreeNode) => void): void; + traversePostOrder(cb: (node: AvlTreeNode) => void): void; +} diff --git a/src/avlTree.js b/src/avlTree.js index a0283d3..8e963ad 100644 --- a/src/avlTree.js +++ b/src/avlTree.js @@ -4,8 +4,8 @@ * @license MIT */ -const BinarySearchTree = require('./binarySearchTree'); -const AvlTreeNode = require('./avlTreeNode'); +const { BinarySearchTree } = require('./binarySearchTree'); +const { AvlTreeNode } = require('./avlTreeNode'); /** * @class AvlTree @@ -167,4 +167,4 @@ class AvlTree extends BinarySearchTree { } } -module.exports = AvlTree; +exports.AvlTree = AvlTree; diff --git a/src/avlTreeNode.d.ts b/src/avlTreeNode.d.ts new file mode 100644 index 0000000..ad2994f --- /dev/null +++ b/src/avlTreeNode.d.ts @@ -0,0 +1,14 @@ +import { BinarySearchTreeNode } from './binarySearchTreeNode'; + +export class AvlTreeNode extends BinarySearchTreeNode { + rotateLeft(): AvlTreeNode; + rotateRight(): AvlTreeNode; + rotateLeftRight(): AvlTreeNode; + rotateRightLeft(): AvlTreeNode; + updateHeight(): AvlTreeNode; + getHeight(): number; + getLeftHeight(): number; + getRightHeight(): number; + getBalance(): number; + isBalanced(): boolean; +} diff --git a/src/avlTreeNode.js b/src/avlTreeNode.js index 2e502a8..3574da3 100644 --- a/src/avlTreeNode.js +++ b/src/avlTreeNode.js @@ -4,7 +4,7 @@ * @license MIT */ -const BinarySearchTreeNode = require('./binarySearchTreeNode'); +const { BinarySearchTreeNode } = require('./binarySearchTreeNode'); /** * @class AvlTreeNode @@ -178,4 +178,4 @@ class AvlTreeNode extends BinarySearchTreeNode { } } -module.exports = AvlTreeNode; +exports.AvlTreeNode = AvlTreeNode; diff --git a/src/binarySearchTree.d.ts b/src/binarySearchTree.d.ts new file mode 100644 index 0000000..dba0b5e --- /dev/null +++ b/src/binarySearchTree.d.ts @@ -0,0 +1,18 @@ +import { BinarySearchTreeNode } from './binarySearchTreeNode'; + +export class BinarySearchTree { + insert(key: T, value: U): BinarySearchTreeNode; + has(key: T): boolean; + find(key: T): BinarySearchTreeNode; + max(node?: BinarySearchTreeNode): BinarySearchTreeNode; + min(node?: BinarySearchTreeNode): BinarySearchTreeNode; + lowerBound(k: T, node?: BinarySearchTreeNode): BinarySearchTreeNode; + upperBound(k: T, node?: BinarySearchTreeNode): BinarySearchTreeNode; + root(): BinarySearchTreeNode; + count(): number; + remove(k: T): boolean; + traverseInOrder(cb: (node: BinarySearchTreeNode) => void): void; + traversePreOrder(cb: (node: BinarySearchTreeNode) => void): void; + traversePostOrder(cb: (node: BinarySearchTreeNode) => void): void; + clear(): void; +} diff --git a/src/binarySearchTree.js b/src/binarySearchTree.js index cca16b3..5cacd58 100644 --- a/src/binarySearchTree.js +++ b/src/binarySearchTree.js @@ -4,7 +4,7 @@ * @license MIT */ -const BinarySearchTreeNode = require('./binarySearchTreeNode'); +const { BinarySearchTreeNode } = require('./binarySearchTreeNode'); /** * @class BinarySearchTree @@ -350,4 +350,4 @@ class BinarySearchTree { } } -module.exports = BinarySearchTree; +exports.BinarySearchTree = BinarySearchTree; diff --git a/src/binarySearchTreeNode.d.ts b/src/binarySearchTreeNode.d.ts new file mode 100644 index 0000000..5c1878b --- /dev/null +++ b/src/binarySearchTreeNode.d.ts @@ -0,0 +1,18 @@ +export class BinarySearchTreeNode { + constructor(key: T, value: U); + setKey(key: T): BinarySearchTreeNode; + getKey(): T; + setValue(value: U): BinarySearchTreeNode; + getValue(): U; + setLeft(left: BinarySearchTreeNode): BinarySearchTreeNode; + getLeft(): BinarySearchTreeNode; + hasLeft(): boolean; + setRight(right: BinarySearchTreeNode): BinarySearchTreeNode; + getRight(): BinarySearchTreeNode; + hasRight(): boolean; + setParent(right: BinarySearchTreeNode): BinarySearchTreeNode; + getParent(): BinarySearchTreeNode; + hasParent(): boolean; + isRoot(): boolean; + isLeaf(): boolean; +} diff --git a/src/binarySearchTreeNode.js b/src/binarySearchTreeNode.js index 1895879..8b04a71 100644 --- a/src/binarySearchTreeNode.js +++ b/src/binarySearchTreeNode.js @@ -159,4 +159,4 @@ class BinarySearchTreeNode { } } -module.exports = BinarySearchTreeNode; +exports.BinarySearchTreeNode = BinarySearchTreeNode; diff --git a/test/avlTree.test.js b/test/avlTree.test.js index 59c7439..125dd1e 100644 --- a/test/avlTree.test.js +++ b/test/avlTree.test.js @@ -1,5 +1,5 @@ const { expect } = require('chai'); -const AvlTree = require('../src/avlTree'); +const { AvlTree } = require('../src/avlTree'); describe('AvlTree tests', () => { const avlTree = new AvlTree(); diff --git a/test/binarySearchTree.test.js b/test/binarySearchTree.test.js index 9460da3..cb48568 100644 --- a/test/binarySearchTree.test.js +++ b/test/binarySearchTree.test.js @@ -1,6 +1,6 @@ const { expect } = require('chai'); -const BinarySearchTreeNode = require('../src/binarySearchTreeNode'); -const BinarySearchTree = require('../src/binarySearchTree'); +const { BinarySearchTreeNode } = require('../src/binarySearchTreeNode'); +const { BinarySearchTree } = require('../src/binarySearchTree'); describe('BinarySearchTree tests', () => { const bst = new BinarySearchTree();