data-structure-typed 1.41.0 → 1.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +6 -3
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +30 -8
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +5 -4
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +42 -44
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +6 -3
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +29 -8
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +1 -1
- package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +5 -4
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +43 -45
- package/dist/mjs/data-structures/binary-tree/tree-multiset.js +2 -2
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +9 -9
- package/src/data-structures/binary-tree/avl-tree.ts +3 -2
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +65 -17
- package/src/data-structures/binary-tree/bst.ts +7 -4
- package/src/data-structures/binary-tree/rb-tree.ts +47 -68
- package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
- package/src/data-structures/graph/abstract-graph.ts +11 -12
- package/src/data-structures/graph/directed-graph.ts +7 -6
- package/src/data-structures/graph/undirected-graph.ts +7 -6
- package/src/data-structures/hash/hash-map.ts +1 -1
- package/src/data-structures/hash/tree-map.ts +1 -2
- package/src/data-structures/hash/tree-set.ts +1 -2
- package/src/data-structures/heap/heap.ts +2 -2
- package/src/data-structures/heap/max-heap.ts +1 -1
- package/src/data-structures/heap/min-heap.ts +1 -1
- package/src/data-structures/linked-list/doubly-linked-list.ts +1 -1
- package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
- package/src/data-structures/matrix/matrix.ts +1 -1
- package/src/data-structures/matrix/vector2d.ts +1 -2
- package/src/data-structures/priority-queue/max-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/min-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/priority-queue.ts +1 -1
- package/src/data-structures/queue/deque.ts +3 -4
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/types/data-structures/matrix/navigator.ts +1 -1
- package/src/types/utils/utils.ts +1 -1
- package/src/types/utils/validate-type.ts +2 -2
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +6 -6
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +11 -11
- package/test/unit/data-structures/binary-tree/bst.test.ts +22 -20
- package/test/unit/data-structures/binary-tree/overall.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +53 -17
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +8 -8
- package/test/utils/big-o.js +10 -0
|
@@ -26,7 +26,6 @@ export abstract class AbstractVertex<V = any> {
|
|
|
26
26
|
this.key = key;
|
|
27
27
|
this.value = value;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
export abstract class AbstractEdge<E = any> {
|
|
@@ -65,7 +64,8 @@ export abstract class AbstractGraph<
|
|
|
65
64
|
E = any,
|
|
66
65
|
VO extends AbstractVertex<V> = AbstractVertex<V>,
|
|
67
66
|
EO extends AbstractEdge<E> = AbstractEdge<E>
|
|
68
|
-
> implements IGraph<V, E, VO, EO>
|
|
67
|
+
> implements IGraph<V, E, VO, EO>
|
|
68
|
+
{
|
|
69
69
|
protected _vertices: Map<VertexKey, VO> = new Map<VertexKey, VO>();
|
|
70
70
|
|
|
71
71
|
get vertices(): Map<VertexKey, VO> {
|
|
@@ -513,14 +513,14 @@ export abstract class AbstractGraph<
|
|
|
513
513
|
}
|
|
514
514
|
|
|
515
515
|
getMinDist &&
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
516
|
+
distMap.forEach((d, v) => {
|
|
517
|
+
if (v !== srcVertex) {
|
|
518
|
+
if (d < minDist) {
|
|
519
|
+
minDist = d;
|
|
520
|
+
if (genPaths) minDest = v;
|
|
521
|
+
}
|
|
521
522
|
}
|
|
522
|
-
}
|
|
523
|
-
});
|
|
523
|
+
});
|
|
524
524
|
|
|
525
525
|
genPaths && getPaths(minDest);
|
|
526
526
|
|
|
@@ -582,7 +582,7 @@ export abstract class AbstractGraph<
|
|
|
582
582
|
if (vertexOrKey instanceof AbstractVertex) distMap.set(vertexOrKey, Infinity);
|
|
583
583
|
}
|
|
584
584
|
|
|
585
|
-
const heap = new PriorityQueue<{
|
|
585
|
+
const heap = new PriorityQueue<{key: number; value: VO}>({comparator: (a, b) => a.key - b.key});
|
|
586
586
|
heap.add({key: 0, value: srcVertex});
|
|
587
587
|
|
|
588
588
|
distMap.set(srcVertex, 0);
|
|
@@ -811,7 +811,7 @@ export abstract class AbstractGraph<
|
|
|
811
811
|
* `predecessor` property is a 2D array of vertices (or `null`) representing the predecessor vertices in the shortest
|
|
812
812
|
* path between vertices in the
|
|
813
813
|
*/
|
|
814
|
-
floyd(): {
|
|
814
|
+
floyd(): {costs: number[][]; predecessor: (VO | null)[][]} {
|
|
815
815
|
const idAndVertices = [...this._vertices];
|
|
816
816
|
const n = idAndVertices.length;
|
|
817
817
|
|
|
@@ -996,5 +996,4 @@ export abstract class AbstractGraph<
|
|
|
996
996
|
protected _getVertexKey(vertexOrKey: VO | VertexKey): VertexKey {
|
|
997
997
|
return vertexOrKey instanceof AbstractVertex ? vertexOrKey.key : vertexOrKey;
|
|
998
998
|
}
|
|
999
|
-
|
|
1000
999
|
}
|
|
@@ -46,13 +46,14 @@ export class DirectedEdge<E = any> extends AbstractEdge<E> {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export class DirectedGraph<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
>
|
|
49
|
+
V = any,
|
|
50
|
+
E = any,
|
|
51
|
+
VO extends DirectedVertex<V> = DirectedVertex<V>,
|
|
52
|
+
EO extends DirectedEdge<E> = DirectedEdge<E>
|
|
53
|
+
>
|
|
54
54
|
extends AbstractGraph<V, E, VO, EO>
|
|
55
|
-
implements IGraph<V, E, VO, EO>
|
|
55
|
+
implements IGraph<V, E, VO, EO>
|
|
56
|
+
{
|
|
56
57
|
/**
|
|
57
58
|
* The constructor function initializes an instance of a class.
|
|
58
59
|
*/
|
|
@@ -43,13 +43,14 @@ export class UndirectedEdge<E = number> extends AbstractEdge<E> {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export class UndirectedGraph<
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
>
|
|
46
|
+
V = any,
|
|
47
|
+
E = any,
|
|
48
|
+
VO extends UndirectedVertex<V> = UndirectedVertex<V>,
|
|
49
|
+
EO extends UndirectedEdge<E> = UndirectedEdge<E>
|
|
50
|
+
>
|
|
51
51
|
extends AbstractGraph<V, E, VO, EO>
|
|
52
|
-
implements IGraph<V, E, VO, EO>
|
|
52
|
+
implements IGraph<V, E, VO, EO>
|
|
53
|
+
{
|
|
53
54
|
/**
|
|
54
55
|
* The constructor initializes a new Map object to store edges.
|
|
55
56
|
*/
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export class TreeMap {
|
|
2
|
-
}
|
|
1
|
+
export class TreeMap {}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export class TreeSet {
|
|
2
|
-
}
|
|
1
|
+
export class TreeSet {}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import type {Comparator, DFSOrderPattern} from '../../types';
|
|
9
9
|
|
|
10
10
|
export class Heap<E = any> {
|
|
11
|
-
constructor(options: {
|
|
11
|
+
constructor(options: {comparator: Comparator<E>; nodes?: E[]}) {
|
|
12
12
|
this._comparator = options.comparator;
|
|
13
13
|
if (options.nodes && options.nodes.length > 0) {
|
|
14
14
|
this._nodes = options.nodes;
|
|
@@ -48,7 +48,7 @@ export class Heap<E = any> {
|
|
|
48
48
|
* @returns A new Heap instance.
|
|
49
49
|
* @param options
|
|
50
50
|
*/
|
|
51
|
-
static heapify<E>(options: {
|
|
51
|
+
static heapify<E>(options: {nodes: E[]; comparator: Comparator<E>}): Heap<E> {
|
|
52
52
|
return new Heap<E>(options);
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -11,7 +11,7 @@ import type {Comparator} from '../../types';
|
|
|
11
11
|
|
|
12
12
|
export class MaxHeap<E = any> extends Heap<E> {
|
|
13
13
|
constructor(
|
|
14
|
-
options: {
|
|
14
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
15
15
|
comparator: (a: E, b: E) => {
|
|
16
16
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
17
17
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -11,7 +11,7 @@ import type {Comparator} from '../../types';
|
|
|
11
11
|
|
|
12
12
|
export class MinHeap<E = any> extends Heap<E> {
|
|
13
13
|
constructor(
|
|
14
|
-
options: {
|
|
14
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
15
15
|
comparator: (a: E, b: E) => {
|
|
16
16
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
17
17
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -594,7 +594,7 @@ export class DoublyLinkedList<E = any> {
|
|
|
594
594
|
/**
|
|
595
595
|
* The function returns an iterator that iterates over the values of a linked list.
|
|
596
596
|
*/
|
|
597
|
-
*
|
|
597
|
+
*[Symbol.iterator]() {
|
|
598
598
|
let current = this.head;
|
|
599
599
|
|
|
600
600
|
while (current) {
|
|
@@ -565,7 +565,7 @@ export class SinglyLinkedList<E = any> {
|
|
|
565
565
|
/**
|
|
566
566
|
* The function returns an iterator that iterates over the values of a linked list.
|
|
567
567
|
*/
|
|
568
|
-
*
|
|
568
|
+
*[Symbol.iterator]() {
|
|
569
569
|
let current = this.head;
|
|
570
570
|
|
|
571
571
|
while (current) {
|
|
@@ -14,7 +14,7 @@ export class MatrixNTI2D<V = any> {
|
|
|
14
14
|
* given initial value or 0 if not provided.
|
|
15
15
|
* @param options - An object containing the following properties:
|
|
16
16
|
*/
|
|
17
|
-
constructor(options: {
|
|
17
|
+
constructor(options: {row: number; col: number; initialVal?: V}) {
|
|
18
18
|
const {row, col, initialVal} = options;
|
|
19
19
|
this._matrix = new Array(row).fill(undefined).map(() => new Array(col).fill(initialVal || 0));
|
|
20
20
|
}
|
|
@@ -10,7 +10,7 @@ import type {Comparator} from '../../types';
|
|
|
10
10
|
|
|
11
11
|
export class MaxPriorityQueue<E = any> extends PriorityQueue<E> {
|
|
12
12
|
constructor(
|
|
13
|
-
options: {
|
|
13
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
14
14
|
comparator: (a: E, b: E) => {
|
|
15
15
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
16
16
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -10,7 +10,7 @@ import type {Comparator} from '../../types';
|
|
|
10
10
|
|
|
11
11
|
export class MinPriorityQueue<E = any> extends PriorityQueue<E> {
|
|
12
12
|
constructor(
|
|
13
|
-
options: {
|
|
13
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
14
14
|
comparator: (a: E, b: E) => {
|
|
15
15
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
16
16
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -10,7 +10,7 @@ import {Heap} from '../heap';
|
|
|
10
10
|
import {Comparator} from '../../types';
|
|
11
11
|
|
|
12
12
|
export class PriorityQueue<E = any> extends Heap<E> {
|
|
13
|
-
constructor(options: {
|
|
13
|
+
constructor(options: {comparator: Comparator<E>; nodes?: E[]}) {
|
|
14
14
|
super(options);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -9,8 +9,7 @@ import {DoublyLinkedList} from '../linked-list';
|
|
|
9
9
|
|
|
10
10
|
// O(n) time complexity of obtaining the value
|
|
11
11
|
// O(1) time complexity of adding at the beginning and the end
|
|
12
|
-
export class Deque<E = any> extends DoublyLinkedList<E> {
|
|
13
|
-
}
|
|
12
|
+
export class Deque<E = any> extends DoublyLinkedList<E> {}
|
|
14
13
|
|
|
15
14
|
// O(1) time complexity of obtaining the value
|
|
16
15
|
// O(n) time complexity of adding at the beginning and the end
|
|
@@ -20,9 +19,9 @@ export class ObjectDeque<E = number> {
|
|
|
20
19
|
if (capacity !== undefined) this._capacity = capacity;
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
protected _nodes: {
|
|
22
|
+
protected _nodes: {[key: number]: E} = {};
|
|
24
23
|
|
|
25
|
-
get nodes(): {
|
|
24
|
+
get nodes(): {[p: number]: E} {
|
|
26
25
|
return this._nodes;
|
|
27
26
|
}
|
|
28
27
|
|
package/src/types/utils/utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type ToThunkFn = () => ReturnType<TrlFn>;
|
|
2
|
-
export type Thunk = () => ReturnType<ToThunkFn> & {
|
|
2
|
+
export type Thunk = () => ReturnType<ToThunkFn> & {__THUNK__: symbol};
|
|
3
3
|
export type TrlFn = (...args: any[]) => any;
|
|
4
4
|
export type TrlAsyncFn = (...args: any[]) => any;
|
|
5
5
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export type KeyValueObject = {
|
|
1
|
+
export type KeyValueObject = {[key: string]: any};
|
|
2
2
|
|
|
3
|
-
export type KeyValueObjectWithKey = {
|
|
3
|
+
export type KeyValueObjectWithKey = {[key: string]: any; key: string | number | symbol};
|
|
4
4
|
|
|
5
5
|
export type NonNumberNonObjectButDefined = string | boolean | symbol | null;
|
|
6
6
|
|
|
@@ -7,18 +7,18 @@ describe('AVL Tree Test', () => {
|
|
|
7
7
|
|
|
8
8
|
for (const i of arr) tree.add(i, i);
|
|
9
9
|
|
|
10
|
-
const node6 = tree.
|
|
10
|
+
const node6 = tree.getNode(6);
|
|
11
11
|
|
|
12
12
|
expect(node6 && tree.getHeight(node6)).toBe(3);
|
|
13
13
|
expect(node6 && tree.getDepth(node6)).toBe(1);
|
|
14
14
|
|
|
15
|
-
const getNodeById = tree.
|
|
15
|
+
const getNodeById = tree.getNode(10);
|
|
16
16
|
expect(getNodeById?.key).toBe(10);
|
|
17
17
|
|
|
18
18
|
const getMinNodeByRoot = tree.getLeftMost();
|
|
19
19
|
expect(getMinNodeByRoot?.key).toBe(1);
|
|
20
20
|
|
|
21
|
-
const node15 = tree.
|
|
21
|
+
const node15 = tree.getNode(15);
|
|
22
22
|
const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
|
|
23
23
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
24
24
|
|
|
@@ -116,18 +116,18 @@ describe('AVL Tree Test recursively', () => {
|
|
|
116
116
|
|
|
117
117
|
for (const i of arr) tree.add(i, i);
|
|
118
118
|
|
|
119
|
-
const node6 = tree.
|
|
119
|
+
const node6 = tree.getNode(6);
|
|
120
120
|
|
|
121
121
|
expect(node6 && tree.getHeight(node6)).toBe(3);
|
|
122
122
|
expect(node6 && tree.getDepth(node6)).toBe(1);
|
|
123
123
|
|
|
124
|
-
const getNodeById = tree.
|
|
124
|
+
const getNodeById = tree.getNode(10);
|
|
125
125
|
expect(getNodeById?.key).toBe(10);
|
|
126
126
|
|
|
127
127
|
const getMinNodeByRoot = tree.getLeftMost();
|
|
128
128
|
expect(getMinNodeByRoot?.key).toBe(1);
|
|
129
129
|
|
|
130
|
-
const node15 = tree.
|
|
130
|
+
const node15 = tree.getNode(15);
|
|
131
131
|
const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
|
|
132
132
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
133
133
|
|
|
@@ -107,7 +107,7 @@ describe('BinaryTree', () => {
|
|
|
107
107
|
expect(tree.has(2)).toBe(true);
|
|
108
108
|
expect(tree.has(3)).toBe(true);
|
|
109
109
|
expect(tree.has(4)).toBe(false);
|
|
110
|
-
const node4 = tree.
|
|
110
|
+
const node4 = tree.getNode(4);
|
|
111
111
|
expect(tree.has(node4)).toBe(false);
|
|
112
112
|
expect(tree.has(node4, node => node)).toBe(false);
|
|
113
113
|
expect(tree.has('3', node => node.value?.toString())).toBe(true);
|
|
@@ -169,13 +169,13 @@ describe('BinaryTree', () => {
|
|
|
169
169
|
new BinaryTreeNode(4, 4)
|
|
170
170
|
]);
|
|
171
171
|
|
|
172
|
-
expect(tree.isSubtreeBST(tree.
|
|
173
|
-
expect(tree.isSubtreeBST(tree.
|
|
172
|
+
expect(tree.isSubtreeBST(tree.getNode(4), IterationType.RECURSIVE)).toBe(true);
|
|
173
|
+
expect(tree.isSubtreeBST(tree.getNode(4), IterationType.ITERATIVE)).toBe(true);
|
|
174
174
|
});
|
|
175
175
|
|
|
176
176
|
it('should subTreeTraverse', () => {
|
|
177
177
|
tree.addMany([4, 2, 6, 1, 3, 5, 7]);
|
|
178
|
-
expect(tree.subTreeTraverse(node => node.key, tree.
|
|
178
|
+
expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.RECURSIVE)).toEqual([6, 5, 7]);
|
|
179
179
|
});
|
|
180
180
|
|
|
181
181
|
it('should clear the tree', () => {
|
|
@@ -234,9 +234,9 @@ describe('BinaryTree Morris Traversal', () => {
|
|
|
234
234
|
});
|
|
235
235
|
|
|
236
236
|
it('after morris traversals should the structure of the tree be correct', () => {
|
|
237
|
-
const node1 = tree.
|
|
238
|
-
const node2 = tree.
|
|
239
|
-
const node3 = tree.
|
|
237
|
+
const node1 = tree.getNode(1);
|
|
238
|
+
const node2 = tree.getNode(2);
|
|
239
|
+
const node3 = tree.getNode(3);
|
|
240
240
|
expect(node1?.left).toBe(node2);
|
|
241
241
|
expect(node1?.right).toBe(node3);
|
|
242
242
|
});
|
|
@@ -339,8 +339,8 @@ describe('BinaryTree', () => {
|
|
|
339
339
|
tree.add(3, 'B');
|
|
340
340
|
tree.add(7, 'C');
|
|
341
341
|
|
|
342
|
-
const nodeA = tree.
|
|
343
|
-
const nodeB = tree.
|
|
342
|
+
const nodeA = tree.getNode(5);
|
|
343
|
+
const nodeB = tree.getNode(3);
|
|
344
344
|
|
|
345
345
|
expect(nodeA?.key).toBe(5);
|
|
346
346
|
expect(nodeA?.value).toBe('A');
|
|
@@ -351,7 +351,7 @@ describe('BinaryTree', () => {
|
|
|
351
351
|
it('should return null when getting a non-existent node', () => {
|
|
352
352
|
tree.add(5, 'A');
|
|
353
353
|
|
|
354
|
-
const node = tree.
|
|
354
|
+
const node = tree.getNode(3);
|
|
355
355
|
|
|
356
356
|
expect(node).toBe(null);
|
|
357
357
|
});
|
|
@@ -421,7 +421,7 @@ describe('BinaryTree', () => {
|
|
|
421
421
|
tree.delete(3);
|
|
422
422
|
|
|
423
423
|
expect(tree.size).toBe(2);
|
|
424
|
-
expect(tree.
|
|
424
|
+
expect(tree.getNode(3)).toBe(null);
|
|
425
425
|
});
|
|
426
426
|
|
|
427
427
|
it('should check if the tree is perfectly balanced', () => {
|
|
@@ -19,20 +19,20 @@ describe('BST operations test', () => {
|
|
|
19
19
|
|
|
20
20
|
expect(bst.has(6)).toBe(true);
|
|
21
21
|
|
|
22
|
-
const node6 = bst.
|
|
22
|
+
const node6 = bst.getNode(6);
|
|
23
23
|
expect(node6 && bst.getHeight(6)).toBe(2);
|
|
24
24
|
expect(node6 && bst.getDepth(6)).toBe(3);
|
|
25
25
|
|
|
26
|
-
const nodeId10 = bst.
|
|
26
|
+
const nodeId10 = bst.getNode(10);
|
|
27
27
|
expect(nodeId10?.key).toBe(10);
|
|
28
28
|
|
|
29
|
-
const nodeVal9 = bst.
|
|
29
|
+
const nodeVal9 = bst.getNode(9, node => node.value);
|
|
30
30
|
expect(nodeVal9?.key).toBe(9);
|
|
31
31
|
|
|
32
32
|
const leftMost = bst.getLeftMost();
|
|
33
33
|
expect(leftMost?.key).toBe(1);
|
|
34
34
|
|
|
35
|
-
const node15 = bst.
|
|
35
|
+
const node15 = bst.getNode(15);
|
|
36
36
|
const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
|
|
37
37
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
38
38
|
|
|
@@ -46,7 +46,7 @@ describe('BST operations test', () => {
|
|
|
46
46
|
|
|
47
47
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
48
48
|
|
|
49
|
-
const node11 = bst.
|
|
49
|
+
const node11 = bst.getNode(11);
|
|
50
50
|
expect(node11).toBeInstanceOf(BSTNode);
|
|
51
51
|
|
|
52
52
|
const dfsInorderNodes = bst.dfs(node => node, 'in');
|
|
@@ -222,20 +222,20 @@ describe('BST operations test', () => {
|
|
|
222
222
|
|
|
223
223
|
expect(objBST.has(6)).toBe(true);
|
|
224
224
|
|
|
225
|
-
const node6 = objBST.
|
|
225
|
+
const node6 = objBST.getNode(6);
|
|
226
226
|
expect(node6 && objBST.getHeight(node6)).toBe(2);
|
|
227
227
|
expect(node6 && objBST.getDepth(node6)).toBe(3);
|
|
228
228
|
|
|
229
|
-
const nodeId10 = objBST.
|
|
229
|
+
const nodeId10 = objBST.getNode(10);
|
|
230
230
|
expect(nodeId10?.key).toBe(10);
|
|
231
231
|
|
|
232
|
-
const nodeVal9 = objBST.
|
|
232
|
+
const nodeVal9 = objBST.getNode(9);
|
|
233
233
|
expect(nodeVal9?.key).toBe(9);
|
|
234
234
|
|
|
235
235
|
const leftMost = objBST.getLeftMost();
|
|
236
236
|
expect(leftMost?.key).toBe(1);
|
|
237
237
|
|
|
238
|
-
const node15 = objBST.
|
|
238
|
+
const node15 = objBST.getNode(15);
|
|
239
239
|
expect(node15?.value).toEqual({key: 15, keyA: 15});
|
|
240
240
|
const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
|
|
241
241
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
@@ -250,7 +250,7 @@ describe('BST operations test', () => {
|
|
|
250
250
|
|
|
251
251
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
252
252
|
|
|
253
|
-
const node11 = objBST.
|
|
253
|
+
const node11 = objBST.getNode(11);
|
|
254
254
|
expect(node11).toBeInstanceOf(BSTNode);
|
|
255
255
|
|
|
256
256
|
const dfsInorderNodes = objBST.dfs(node => node, 'in');
|
|
@@ -409,20 +409,21 @@ describe('BST operations test recursively', () => {
|
|
|
409
409
|
|
|
410
410
|
expect(bst.has(6)).toBe(true);
|
|
411
411
|
|
|
412
|
-
const node6 = bst.
|
|
412
|
+
const node6 = bst.getNode(6);
|
|
413
413
|
expect(node6 && bst.getHeight(6)).toBe(2);
|
|
414
414
|
expect(node6 && bst.getDepth(6)).toBe(3);
|
|
415
415
|
|
|
416
|
-
const nodeId10 = bst.
|
|
416
|
+
const nodeId10 = bst.getNode(10);
|
|
417
|
+
expect(bst.get(10)).toBe(10);
|
|
417
418
|
expect(nodeId10?.key).toBe(10);
|
|
418
419
|
|
|
419
|
-
const nodeVal9 = bst.
|
|
420
|
+
const nodeVal9 = bst.getNode(9, node => node.value);
|
|
420
421
|
expect(nodeVal9?.key).toBe(9);
|
|
421
422
|
|
|
422
423
|
const leftMost = bst.getLeftMost();
|
|
423
424
|
expect(leftMost?.key).toBe(1);
|
|
424
425
|
|
|
425
|
-
const node15 = bst.
|
|
426
|
+
const node15 = bst.getNode(15);
|
|
426
427
|
const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
|
|
427
428
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
428
429
|
|
|
@@ -436,7 +437,7 @@ describe('BST operations test recursively', () => {
|
|
|
436
437
|
|
|
437
438
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
438
439
|
|
|
439
|
-
const node11 = bst.
|
|
440
|
+
const node11 = bst.getNode(11);
|
|
440
441
|
expect(node11).toBeInstanceOf(BSTNode);
|
|
441
442
|
|
|
442
443
|
const dfsInorderNodes = bst.dfs(node => node, 'in');
|
|
@@ -612,20 +613,21 @@ describe('BST operations test recursively', () => {
|
|
|
612
613
|
|
|
613
614
|
expect(objBST.has(6)).toBe(true);
|
|
614
615
|
|
|
615
|
-
const node6 = objBST.
|
|
616
|
+
const node6 = objBST.getNode(6);
|
|
617
|
+
expect(objBST.get(6)).toEqual({key: 6, keyA: 6});
|
|
616
618
|
expect(node6 && objBST.getHeight(node6)).toBe(2);
|
|
617
619
|
expect(node6 && objBST.getDepth(node6)).toBe(3);
|
|
618
620
|
|
|
619
|
-
const nodeId10 = objBST.
|
|
621
|
+
const nodeId10 = objBST.getNode(10);
|
|
620
622
|
expect(nodeId10?.key).toBe(10);
|
|
621
623
|
|
|
622
|
-
const nodeVal9 = objBST.
|
|
624
|
+
const nodeVal9 = objBST.getNode(9);
|
|
623
625
|
expect(nodeVal9?.key).toBe(9);
|
|
624
626
|
|
|
625
627
|
const leftMost = objBST.getLeftMost();
|
|
626
628
|
expect(leftMost?.key).toBe(1);
|
|
627
629
|
|
|
628
|
-
const node15 = objBST.
|
|
630
|
+
const node15 = objBST.getNode(15);
|
|
629
631
|
expect(node15?.value).toEqual({key: 15, keyA: 15});
|
|
630
632
|
const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
|
|
631
633
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
@@ -640,7 +642,7 @@ describe('BST operations test recursively', () => {
|
|
|
640
642
|
|
|
641
643
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
642
644
|
|
|
643
|
-
const node11 = objBST.
|
|
645
|
+
const node11 = objBST.getNode(11);
|
|
644
646
|
expect(node11).toBeInstanceOf(BSTNode);
|
|
645
647
|
|
|
646
648
|
const dfsInorderNodes = objBST.dfs(node => node, 'in');
|
|
@@ -20,8 +20,8 @@ describe('Overall BinaryTree Test', () => {
|
|
|
20
20
|
leftMost?.key === 1; // true
|
|
21
21
|
expect(leftMost?.key).toBe(1);
|
|
22
22
|
bst.delete(6);
|
|
23
|
-
bst.
|
|
24
|
-
expect(bst.
|
|
23
|
+
bst.getNode(6); // null
|
|
24
|
+
expect(bst.getNode(6)).toBeNull();
|
|
25
25
|
bst.isAVLBalanced(); // true or false
|
|
26
26
|
expect(bst.isAVLBalanced()).toBe(true);
|
|
27
27
|
const bfsIDs: number[] = [];
|