();
+```
+
+### .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()
#### .setLeft(left)
#### .getLeft()
#### .hasLeft()
@@ -457,14 +471,14 @@ console.log(bst.root()); // null
#### .getRight()
#### .hasRight()
@@ -478,14 +492,14 @@ console.log(bst.root()); // null
#### .getParent()
#### .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).
#### .rotateRight()
@@ -525,7 +539,7 @@ Rotates self right (clockwise).
#### .rotateLeftRight()
@@ -533,7 +547,7 @@ Rotates left child to left then self to right.
#### .rotateRightLeft()
@@ -541,7 +555,7 @@ Rotates right child to right then self to left.
#### .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();