data-structure-typed 1.50.1 → 1.50.2
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 +2 -1
- package/README.md +26 -26
- package/benchmark/report.html +13 -13
- package/benchmark/report.json +153 -159
- package/dist/cjs/data-structures/base/iterable-base.d.ts +114 -9
- package/dist/cjs/data-structures/base/iterable-base.js +143 -7
- package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +43 -46
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +68 -71
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +484 -376
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +54 -74
- package/dist/cjs/data-structures/binary-tree/bst.js +30 -71
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +78 -60
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +84 -89
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +37 -56
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js +64 -85
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -0
- package/dist/cjs/data-structures/graph/abstract-graph.js +3 -0
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.d.ts +14 -0
- package/dist/cjs/data-structures/graph/directed-graph.js +26 -0
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-graph.d.ts +8 -0
- package/dist/cjs/data-structures/graph/map-graph.js +14 -0
- package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.d.ts +16 -0
- package/dist/cjs/data-structures/graph/undirected-graph.js +25 -0
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +121 -15
- package/dist/cjs/data-structures/hash/hash-map.js +160 -25
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +66 -6
- package/dist/cjs/data-structures/heap/heap.js +66 -6
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +67 -50
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +70 -64
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +128 -103
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +130 -112
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js +63 -36
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.d.ts +35 -4
- package/dist/cjs/data-structures/matrix/matrix.js +50 -11
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +49 -19
- package/dist/cjs/data-structures/queue/deque.js +101 -47
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +39 -5
- package/dist/cjs/data-structures/queue/queue.js +47 -5
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +16 -0
- package/dist/cjs/data-structures/stack/stack.js +22 -0
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +38 -1
- package/dist/cjs/data-structures/trie/trie.js +41 -0
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/cjs/types/data-structures/hash/hash-map.d.ts +4 -3
- package/dist/cjs/types/utils/utils.d.ts +1 -0
- package/dist/mjs/data-structures/base/iterable-base.d.ts +114 -9
- package/dist/mjs/data-structures/base/iterable-base.js +143 -7
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +43 -46
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +68 -71
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +483 -375
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +54 -74
- package/dist/mjs/data-structures/binary-tree/bst.js +30 -71
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +78 -60
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +84 -89
- package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +37 -56
- package/dist/mjs/data-structures/binary-tree/tree-multimap.js +64 -85
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -0
- package/dist/mjs/data-structures/graph/abstract-graph.js +3 -0
- package/dist/mjs/data-structures/graph/directed-graph.d.ts +14 -0
- package/dist/mjs/data-structures/graph/directed-graph.js +26 -0
- package/dist/mjs/data-structures/graph/map-graph.d.ts +8 -0
- package/dist/mjs/data-structures/graph/map-graph.js +14 -0
- package/dist/mjs/data-structures/graph/undirected-graph.d.ts +16 -0
- package/dist/mjs/data-structures/graph/undirected-graph.js +25 -0
- package/dist/mjs/data-structures/hash/hash-map.d.ts +121 -15
- package/dist/mjs/data-structures/hash/hash-map.js +160 -25
- package/dist/mjs/data-structures/heap/heap.d.ts +66 -6
- package/dist/mjs/data-structures/heap/heap.js +66 -6
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +67 -50
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +70 -64
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +128 -103
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +130 -112
- package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
- package/dist/mjs/data-structures/linked-list/skip-linked-list.js +63 -36
- package/dist/mjs/data-structures/matrix/matrix.d.ts +35 -4
- package/dist/mjs/data-structures/matrix/matrix.js +50 -11
- package/dist/mjs/data-structures/queue/deque.d.ts +49 -19
- package/dist/mjs/data-structures/queue/deque.js +101 -47
- package/dist/mjs/data-structures/queue/queue.d.ts +39 -5
- package/dist/mjs/data-structures/queue/queue.js +47 -5
- package/dist/mjs/data-structures/stack/stack.d.ts +16 -0
- package/dist/mjs/data-structures/stack/stack.js +22 -0
- package/dist/mjs/data-structures/trie/trie.d.ts +38 -1
- package/dist/mjs/data-structures/trie/trie.js +41 -0
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/mjs/types/data-structures/hash/hash-map.d.ts +4 -3
- package/dist/mjs/types/utils/utils.d.ts +1 -0
- package/dist/umd/data-structure-typed.js +1730 -1042
- package/dist/umd/data-structure-typed.min.js +3 -3
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +8 -3
- package/src/data-structures/base/iterable-base.ts +172 -19
- package/src/data-structures/binary-tree/avl-tree.ts +97 -97
- package/src/data-structures/binary-tree/binary-tree.ts +674 -671
- package/src/data-structures/binary-tree/bst.ts +89 -131
- package/src/data-structures/binary-tree/rb-tree.ts +127 -155
- package/src/data-structures/binary-tree/tree-multimap.ts +96 -112
- package/src/data-structures/graph/abstract-graph.ts +4 -0
- package/src/data-structures/graph/directed-graph.ts +30 -0
- package/src/data-structures/graph/map-graph.ts +15 -0
- package/src/data-structures/graph/undirected-graph.ts +28 -0
- package/src/data-structures/hash/hash-map.ts +175 -34
- package/src/data-structures/heap/heap.ts +66 -6
- package/src/data-structures/linked-list/doubly-linked-list.ts +72 -66
- package/src/data-structures/linked-list/singly-linked-list.ts +132 -114
- package/src/data-structures/linked-list/skip-linked-list.ts +63 -37
- package/src/data-structures/matrix/matrix.ts +52 -12
- package/src/data-structures/queue/deque.ts +108 -49
- package/src/data-structures/queue/queue.ts +51 -5
- package/src/data-structures/stack/stack.ts +24 -0
- package/src/data-structures/trie/trie.ts +45 -1
- package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
- package/src/types/data-structures/hash/hash-map.ts +4 -3
- package/src/types/utils/utils.ts +2 -0
- package/test/performance/data-structures/graph/directed-graph.test.ts +3 -3
- package/test/performance/data-structures/queue/deque.test.ts +26 -25
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +37 -0
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +46 -17
- package/test/unit/data-structures/binary-tree/bst.test.ts +65 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +38 -1
- package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +37 -32
- package/test/unit/data-structures/graph/abstract-graph.test.ts +8 -0
- package/test/unit/data-structures/graph/directed-graph.test.ts +249 -0
- package/test/unit/data-structures/hash/hash-map.test.ts +376 -353
- package/test/unit/data-structures/heap/heap.test.ts +18 -1
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +24 -5
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +20 -2
- package/test/unit/data-structures/linked-list/skip-list.test.ts +1 -1
- package/test/unit/data-structures/queue/deque.test.ts +65 -5
- package/test/unit/data-structures/queue/queue.test.ts +22 -5
- package/test/unit/data-structures/stack/stack.test.ts +17 -0
- package/test/unit/data-structures/trie/trie.test.ts +17 -0
|
@@ -32,12 +32,20 @@ export class Queue<E = any> extends IterableElementBase<E> {
|
|
|
32
32
|
|
|
33
33
|
protected _elements: E[] = [];
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* The elements function returns the elements of this set.
|
|
37
|
+
* @return An array of the elements in the stack
|
|
38
|
+
*/
|
|
35
39
|
get elements(): E[] {
|
|
36
40
|
return this._elements;
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
protected _offset: number = 0;
|
|
40
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The offset function returns the offset of the current page.
|
|
47
|
+
* @return The value of the private variable _offset
|
|
48
|
+
*/
|
|
41
49
|
get offset(): number {
|
|
42
50
|
return this._offset;
|
|
43
51
|
}
|
|
@@ -142,6 +150,26 @@ export class Queue<E = any> extends IterableElementBase<E> {
|
|
|
142
150
|
return first;
|
|
143
151
|
}
|
|
144
152
|
|
|
153
|
+
/**
|
|
154
|
+
* The delete function removes an element from the list.
|
|
155
|
+
* @param element: E Specify the element to be deleted
|
|
156
|
+
* @return A boolean value indicating whether the element was successfully deleted or not
|
|
157
|
+
*/
|
|
158
|
+
delete(element: E): boolean {
|
|
159
|
+
const index = this.elements.indexOf(element);
|
|
160
|
+
return this.deleteAt(index);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The deleteAt function deletes the element at a given index.
|
|
165
|
+
* @param index: number Determine the index of the element to be deleted
|
|
166
|
+
* @return A boolean value
|
|
167
|
+
*/
|
|
168
|
+
deleteAt(index: number): boolean {
|
|
169
|
+
const spliced = this.elements.splice(index, 1);
|
|
170
|
+
return spliced.length === 1;
|
|
171
|
+
}
|
|
172
|
+
|
|
145
173
|
/**
|
|
146
174
|
* Time Complexity: O(1) - constant time as it retrieves the value at the current offset.
|
|
147
175
|
* Space Complexity: O(1) - no additional space is used.
|
|
@@ -219,7 +247,7 @@ export class Queue<E = any> extends IterableElementBase<E> {
|
|
|
219
247
|
*
|
|
220
248
|
* @param index
|
|
221
249
|
*/
|
|
222
|
-
|
|
250
|
+
at(index: number): E | undefined {
|
|
223
251
|
return this.elements[index];
|
|
224
252
|
}
|
|
225
253
|
|
|
@@ -264,13 +292,14 @@ export class Queue<E = any> extends IterableElementBase<E> {
|
|
|
264
292
|
}
|
|
265
293
|
|
|
266
294
|
/**
|
|
267
|
-
* Time Complexity: O(n)
|
|
268
|
-
* Space Complexity: O(n)
|
|
295
|
+
* Time Complexity: O(n)
|
|
296
|
+
* Space Complexity: O(n)
|
|
297
|
+
* where n is the number of elements in the queue. It creates a shallow copy of the internal array. the space required is proportional to the number of elements in the queue.
|
|
269
298
|
*/
|
|
270
299
|
|
|
271
300
|
/**
|
|
272
|
-
* Time Complexity: O(n)
|
|
273
|
-
* Space Complexity: O(n)
|
|
301
|
+
* Time Complexity: O(n)
|
|
302
|
+
* Space Complexity: O(n)
|
|
274
303
|
*
|
|
275
304
|
* The `clone()` function returns a new Queue object with the same elements as the original Queue.
|
|
276
305
|
* @returns The `clone()` method is returning a new instance of the `Queue` class.
|
|
@@ -390,4 +419,21 @@ export class LinkedListQueue<E = any> extends SinglyLinkedList<E> {
|
|
|
390
419
|
peek(): E | undefined {
|
|
391
420
|
return this.first;
|
|
392
421
|
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Time Complexity: O(n)
|
|
425
|
+
* Space Complexity: O(n)
|
|
426
|
+
*/
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Time Complexity: O(n)
|
|
430
|
+
* Space Complexity: O(n)
|
|
431
|
+
* The `clone` function returns a new instance of the `LinkedListQueue` class with the same values as
|
|
432
|
+
* the current instance.
|
|
433
|
+
* @returns The `clone()` method is returning a new instance of `LinkedListQueue` with the same
|
|
434
|
+
* values as the original `LinkedListQueue`.
|
|
435
|
+
*/
|
|
436
|
+
clone(): LinkedListQueue<E> {
|
|
437
|
+
return new LinkedListQueue<E>(this.values());
|
|
438
|
+
}
|
|
393
439
|
}
|
|
@@ -32,6 +32,10 @@ export class Stack<E = any> extends IterableElementBase<E> {
|
|
|
32
32
|
|
|
33
33
|
protected _elements: E[] = [];
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* The elements function returns the elements of this set.
|
|
37
|
+
* @return An array of elements
|
|
38
|
+
*/
|
|
35
39
|
get elements(): E[] {
|
|
36
40
|
return this._elements;
|
|
37
41
|
}
|
|
@@ -125,6 +129,26 @@ export class Stack<E = any> extends IterableElementBase<E> {
|
|
|
125
129
|
return this.elements.pop();
|
|
126
130
|
}
|
|
127
131
|
|
|
132
|
+
/**
|
|
133
|
+
* The delete function removes an element from the stack.
|
|
134
|
+
* @param element: E Specify the element to be deleted
|
|
135
|
+
* @return A boolean value indicating whether the element was successfully deleted or not
|
|
136
|
+
*/
|
|
137
|
+
delete(element: E): boolean {
|
|
138
|
+
const index = this.elements.indexOf(element);
|
|
139
|
+
return this.deleteAt(index);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* The deleteAt function deletes the element at a given index.
|
|
144
|
+
* @param index: number Determine the index of the element to be deleted
|
|
145
|
+
* @return A boolean value
|
|
146
|
+
*/
|
|
147
|
+
deleteAt(index: number): boolean {
|
|
148
|
+
const spliced = this.elements.splice(index, 1);
|
|
149
|
+
return spliced.length === 1;
|
|
150
|
+
}
|
|
151
|
+
|
|
128
152
|
/**
|
|
129
153
|
* Time Complexity: O(n)
|
|
130
154
|
* Space Complexity: O(n)
|
|
@@ -37,7 +37,13 @@ export class TrieNode {
|
|
|
37
37
|
* 10. IP Routing: Used in certain types of IP routing algorithms.
|
|
38
38
|
* 11. Text Word Frequency Count: Counting and storing the frequency of words in a large amount of text data."
|
|
39
39
|
*/
|
|
40
|
-
export class Trie extends IterableElementBase<string> {
|
|
40
|
+
export class Trie extends IterableElementBase<string, Trie> {
|
|
41
|
+
/**
|
|
42
|
+
* The constructor function for the Trie class.
|
|
43
|
+
* @param words: Iterable string Initialize the trie with a set of words
|
|
44
|
+
* @param options?: TrieOptions Allow the user to pass in options for the trie
|
|
45
|
+
* @return This
|
|
46
|
+
*/
|
|
41
47
|
constructor(words: Iterable<string> = [], options?: TrieOptions) {
|
|
42
48
|
super();
|
|
43
49
|
if (options) {
|
|
@@ -51,18 +57,31 @@ export class Trie extends IterableElementBase<string> {
|
|
|
51
57
|
|
|
52
58
|
protected _size: number = 0;
|
|
53
59
|
|
|
60
|
+
/**
|
|
61
|
+
* The size function returns the size of the stack.
|
|
62
|
+
* @return The number of elements in the list
|
|
63
|
+
*/
|
|
54
64
|
get size(): number {
|
|
55
65
|
return this._size;
|
|
56
66
|
}
|
|
57
67
|
|
|
58
68
|
protected _caseSensitive: boolean = true;
|
|
59
69
|
|
|
70
|
+
/**
|
|
71
|
+
* The caseSensitive function is a getter that returns the value of the private _caseSensitive property.
|
|
72
|
+
*
|
|
73
|
+
* @return The value of the _casesensitive private variable
|
|
74
|
+
*/
|
|
60
75
|
get caseSensitive(): boolean {
|
|
61
76
|
return this._caseSensitive;
|
|
62
77
|
}
|
|
63
78
|
|
|
64
79
|
protected _root: TrieNode = new TrieNode('');
|
|
65
80
|
|
|
81
|
+
/**
|
|
82
|
+
* The root function returns the root node of the tree.
|
|
83
|
+
* @return The root node
|
|
84
|
+
*/
|
|
66
85
|
get root() {
|
|
67
86
|
return this._root;
|
|
68
87
|
}
|
|
@@ -124,6 +143,14 @@ export class Trie extends IterableElementBase<string> {
|
|
|
124
143
|
return cur.isEnd;
|
|
125
144
|
}
|
|
126
145
|
|
|
146
|
+
/**
|
|
147
|
+
* The isEmpty function checks if the size of the queue is 0.
|
|
148
|
+
* @return True if the size of the queue is 0
|
|
149
|
+
*/
|
|
150
|
+
isEmpty(): boolean {
|
|
151
|
+
return this.size === 0;
|
|
152
|
+
}
|
|
153
|
+
|
|
127
154
|
/**
|
|
128
155
|
* Time Complexity: O(M), where M is the length of the word being deleted.
|
|
129
156
|
* Space Complexity: O(M) - Due to the recursive DFS approach.
|
|
@@ -351,6 +378,23 @@ export class Trie extends IterableElementBase<string> {
|
|
|
351
378
|
return words;
|
|
352
379
|
}
|
|
353
380
|
|
|
381
|
+
/**
|
|
382
|
+
* Time Complexity: O(n)
|
|
383
|
+
* Space Complexity: O(n)
|
|
384
|
+
*/
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Time Complexity: O(n)
|
|
388
|
+
* Space Complexity: O(n)
|
|
389
|
+
*
|
|
390
|
+
* The `clone` function returns a new instance of the Trie class with the same values and case
|
|
391
|
+
* sensitivity as the original Trie.
|
|
392
|
+
* @returns A new instance of the Trie class is being returned.
|
|
393
|
+
*/
|
|
394
|
+
clone(): Trie {
|
|
395
|
+
return new Trie(this.values(), { caseSensitive: this.caseSensitive });
|
|
396
|
+
}
|
|
397
|
+
|
|
354
398
|
/**
|
|
355
399
|
* Time Complexity: O(n)
|
|
356
400
|
* Space Complexity: O(n)
|
|
@@ -3,7 +3,7 @@ import { IterationType } from "../../common";
|
|
|
3
3
|
|
|
4
4
|
export type BinaryTreeNodeNested<K, V> = BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
5
5
|
|
|
6
|
-
export type BinaryTreeNested<K, V,
|
|
6
|
+
export type BinaryTreeNested<K, V, NODE extends BinaryTreeNode<K, V, NODE>> = BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
7
7
|
|
|
8
8
|
export type BinaryTreeOptions<K> = {
|
|
9
9
|
iterationType?: IterationType,
|
|
@@ -5,14 +5,15 @@ export type HashMapLinkedNode<K, V> = {
|
|
|
5
5
|
prev: HashMapLinkedNode<K, V>;
|
|
6
6
|
};
|
|
7
7
|
|
|
8
|
-
export type LinkedHashMapOptions<K> = {
|
|
8
|
+
export type LinkedHashMapOptions<K, V, R> = {
|
|
9
9
|
hashFn?: (key: K) => string;
|
|
10
10
|
objHashFn?: (key: K) => object;
|
|
11
|
+
toEntryFn?: (rawElement: R) => [K, V];
|
|
11
12
|
};
|
|
12
13
|
|
|
13
|
-
export type HashMapOptions<K, V,
|
|
14
|
+
export type HashMapOptions<K, V, R> = {
|
|
14
15
|
hashFn?: (key: K) => string;
|
|
15
|
-
toEntryFn?: (rawElement:
|
|
16
|
+
toEntryFn?: (rawElement: R) => [K, V];
|
|
16
17
|
};
|
|
17
18
|
|
|
18
19
|
export type HashMapStoreItem<K, V> = { key: K; value: V };
|
package/src/types/utils/utils.ts
CHANGED
|
@@ -28,9 +28,9 @@ suite
|
|
|
28
28
|
.add(`tarjan`, () => {
|
|
29
29
|
graph.tarjan(true);
|
|
30
30
|
})
|
|
31
|
-
.add(`tarjan all`, () => {
|
|
32
|
-
|
|
33
|
-
})
|
|
31
|
+
// .add(`tarjan all`, () => {
|
|
32
|
+
// graph.tarjan(true, true, true, true);
|
|
33
|
+
// })
|
|
34
34
|
.add(`topologicalSort`, () => {
|
|
35
35
|
graph.topologicalSort('key');
|
|
36
36
|
});
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Deque } from '../../../../src';
|
|
2
2
|
import { Deque as CDeque } from 'js-sdsl';
|
|
3
3
|
import * as Benchmark from 'benchmark';
|
|
4
|
-
import {
|
|
4
|
+
import { magnitude } from '../../../utils';
|
|
5
5
|
import { isCompetitor } from '../../../config';
|
|
6
6
|
|
|
7
7
|
export const suite = new Benchmark.Suite();
|
|
8
|
-
const { MILLION, HUNDRED_THOUSAND
|
|
8
|
+
const { MILLION, HUNDRED_THOUSAND } = magnitude;
|
|
9
|
+
// const randomIndicesTenThousand = new Array(TEN_THOUSAND).fill(getRandomInt(0, TEN_THOUSAND - 1));
|
|
9
10
|
|
|
10
11
|
suite.add(`${MILLION.toLocaleString()} push`, () => {
|
|
11
12
|
const deque = new Deque<number>();
|
|
@@ -14,45 +15,45 @@ suite.add(`${MILLION.toLocaleString()} push`, () => {
|
|
|
14
15
|
|
|
15
16
|
if (isCompetitor) {
|
|
16
17
|
suite.add(`CPT ${MILLION.toLocaleString()} push`, () => {
|
|
17
|
-
const
|
|
18
|
-
for (let i = 0; i < MILLION; i++)
|
|
18
|
+
const deque = new CDeque<number>();
|
|
19
|
+
for (let i = 0; i < MILLION; i++) deque.pushBack(i);
|
|
19
20
|
});
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
suite
|
|
23
|
-
.add(`${TEN_THOUSAND.toLocaleString()} push & delete`, () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
})
|
|
24
|
+
// .add(`${TEN_THOUSAND.toLocaleString()} push & delete`, () => {
|
|
25
|
+
// const deque = new Deque<number>();
|
|
26
|
+
//
|
|
27
|
+
// for (let i = 0; i < TEN_THOUSAND; i++) deque.push(i);
|
|
28
|
+
// for (let i = 0; i < TEN_THOUSAND; i++) deque.delete(randomIndicesTenThousand[i]);
|
|
29
|
+
// })
|
|
29
30
|
.add(`${MILLION.toLocaleString()} push & pop`, () => {
|
|
30
|
-
const
|
|
31
|
+
const deque = new Deque<number>();
|
|
31
32
|
|
|
32
|
-
for (let i = 0; i < MILLION; i++)
|
|
33
|
-
for (let i = 0; i < MILLION; i++)
|
|
33
|
+
for (let i = 0; i < MILLION; i++) deque.push(i);
|
|
34
|
+
for (let i = 0; i < MILLION; i++) deque.pop();
|
|
34
35
|
})
|
|
35
36
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
|
|
36
|
-
const
|
|
37
|
+
const deque = new Deque<number>();
|
|
37
38
|
|
|
38
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
39
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
39
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.push(i);
|
|
40
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.shift();
|
|
40
41
|
})
|
|
41
42
|
.add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
|
|
42
|
-
const
|
|
43
|
+
const array = new Array<number>();
|
|
43
44
|
|
|
44
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
45
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
45
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) array.push(i);
|
|
46
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) array.shift();
|
|
46
47
|
})
|
|
47
48
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} unshift & shift`, () => {
|
|
48
|
-
const
|
|
49
|
+
const deque = new Deque<number>();
|
|
49
50
|
|
|
50
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
51
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
51
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.unshift(i);
|
|
52
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.shift();
|
|
52
53
|
})
|
|
53
54
|
.add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} unshift & shift`, () => {
|
|
54
|
-
const
|
|
55
|
+
const array = new Array<number>();
|
|
55
56
|
|
|
56
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
57
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
57
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) array.unshift(i);
|
|
58
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) array.shift();
|
|
58
59
|
});
|
|
@@ -235,6 +235,43 @@ describe('AVLTree APIs test', () => {
|
|
|
235
235
|
const bfsRes = avl.bfs(node => node.key);
|
|
236
236
|
expect(bfsRes[0]).toBe(2);
|
|
237
237
|
});
|
|
238
|
+
|
|
239
|
+
it('should the clone method', () => {
|
|
240
|
+
function checkTreeStructure(avl: AVLTree<string, number>) {
|
|
241
|
+
expect(avl.size).toBe(4);
|
|
242
|
+
expect(avl.root?.key).toBe('2');
|
|
243
|
+
expect(avl.root?.left?.key).toBe('1');
|
|
244
|
+
expect(avl.root?.left?.left?.key).toBe(undefined);
|
|
245
|
+
expect(avl.root?.left?.right?.key).toBe(undefined);
|
|
246
|
+
expect(avl.root?.right?.key).toBe('4');
|
|
247
|
+
expect(avl.root?.right?.left?.key).toBe(undefined);
|
|
248
|
+
expect(avl.root?.right?.right?.key).toBe('5');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const avl = new AVLTree<string, number>();
|
|
252
|
+
avl.addMany([
|
|
253
|
+
['2', 2],
|
|
254
|
+
['4', 4],
|
|
255
|
+
['5', 5],
|
|
256
|
+
['3', 3],
|
|
257
|
+
['1', 1]
|
|
258
|
+
]);
|
|
259
|
+
expect(avl.size).toBe(5);
|
|
260
|
+
expect(avl.root?.key).toBe('2');
|
|
261
|
+
expect(avl.root?.left?.key).toBe('1');
|
|
262
|
+
expect(avl.root?.left?.left?.key).toBe(undefined);
|
|
263
|
+
expect(avl.root?.left?.right?.key).toBe(undefined);
|
|
264
|
+
expect(avl.root?.right?.key).toBe('4');
|
|
265
|
+
expect(avl.root?.right?.left?.key).toBe('3');
|
|
266
|
+
expect(avl.root?.right?.right?.key).toBe('5');
|
|
267
|
+
avl.delete('3');
|
|
268
|
+
checkTreeStructure(avl);
|
|
269
|
+
const cloned = avl.clone();
|
|
270
|
+
checkTreeStructure(cloned);
|
|
271
|
+
cloned.delete('1');
|
|
272
|
+
expect(avl.size).toBe(4);
|
|
273
|
+
expect(cloned.size).toBe(3);
|
|
274
|
+
});
|
|
238
275
|
});
|
|
239
276
|
|
|
240
277
|
describe('AVLTree', () => {
|
|
@@ -152,6 +152,51 @@ describe('BinaryTree', () => {
|
|
|
152
152
|
expect(tree.has('3', node => node.value?.toString())).toBe(true);
|
|
153
153
|
});
|
|
154
154
|
|
|
155
|
+
it('should the clone method work fine', () => {
|
|
156
|
+
expect(tree.isEmpty()).toBe(true);
|
|
157
|
+
tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
158
|
+
expect(tree.root?.key).toBe(4);
|
|
159
|
+
expect(tree.root?.left?.key).toBe(2);
|
|
160
|
+
expect(tree.root?.left?.left).toBe(null);
|
|
161
|
+
expect(tree.root?.left?.right?.key).toBe(1);
|
|
162
|
+
expect(tree.root?.right?.key).toBe(6);
|
|
163
|
+
expect(tree.root?.right?.left?.key).toBe(3);
|
|
164
|
+
expect(tree.root?.right?.right).toBe(null);
|
|
165
|
+
|
|
166
|
+
const cloned = tree.clone();
|
|
167
|
+
expect(cloned.root?.key).toBe(4);
|
|
168
|
+
expect(cloned.root?.left?.key).toBe(2);
|
|
169
|
+
expect(cloned.root?.left?.left).toBe(null);
|
|
170
|
+
expect(cloned.root?.left?.right?.key).toBe(1);
|
|
171
|
+
expect(cloned.root?.right?.key).toBe(6);
|
|
172
|
+
expect(cloned.root?.right?.left?.key).toBe(3);
|
|
173
|
+
expect(cloned.root?.right?.right).toBe(null);
|
|
174
|
+
expect(cloned.dfs(node => node.key, 'pre', cloned.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
|
|
175
|
+
expect(
|
|
176
|
+
cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), IterationType.ITERATIVE, true)
|
|
177
|
+
).toEqual([6, 3, 7, null]);
|
|
178
|
+
expect(
|
|
179
|
+
cloned.dfs(node => (node ? node.key : node), 'pre', cloned.getNode(6), IterationType.ITERATIVE, true)
|
|
180
|
+
).toEqual([6, 3, 7, null]);
|
|
181
|
+
expect(
|
|
182
|
+
cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), IterationType.RECURSIVE, true)
|
|
183
|
+
).toEqual([6, 3, 7, null]);
|
|
184
|
+
cloned.delete(6);
|
|
185
|
+
cloned.delete(3);
|
|
186
|
+
cloned.delete(7);
|
|
187
|
+
cloned.delete(1);
|
|
188
|
+
cloned.delete(5);
|
|
189
|
+
cloned.delete(4);
|
|
190
|
+
cloned.delete(2);
|
|
191
|
+
// cloned.delete(null);
|
|
192
|
+
// cloned.delete(null);
|
|
193
|
+
// cloned.delete(null);
|
|
194
|
+
expect(tree.size).toBe(10);
|
|
195
|
+
expect(cloned.size).toBe(3);
|
|
196
|
+
// expect(cloned.size).toBe(0);
|
|
197
|
+
// expect(cloned.isEmpty()).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
|
|
155
200
|
it('should be a balance tree after malicious manipulation', () => {
|
|
156
201
|
tree.add(3);
|
|
157
202
|
tree.add(12);
|
|
@@ -238,22 +283,6 @@ describe('BinaryTree', () => {
|
|
|
238
283
|
expect(tree.getNodes(tree.getNodeByKey(2), undefined, false, tree.root)).toEqual([tree.getNodeByKey(2)]);
|
|
239
284
|
});
|
|
240
285
|
|
|
241
|
-
// it('should subTreeTraverse', () => {
|
|
242
|
-
// tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
243
|
-
// expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
|
|
244
|
-
// expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.ITERATIVE, false)).toEqual([6, 3, 7]);
|
|
245
|
-
// expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.RECURSIVE)).toEqual([6, 3, 7]);
|
|
246
|
-
// expect(
|
|
247
|
-
// tree.subTreeTraverse(node => (node ? node.key : null), tree.getNode(6), IterationType.ITERATIVE, true)
|
|
248
|
-
// ).toEqual([6, 3, 7, null]);
|
|
249
|
-
// expect(
|
|
250
|
-
// tree.subTreeTraverse(node => (node ? node.key : node), tree.getNode(6), IterationType.ITERATIVE, true)
|
|
251
|
-
// ).toEqual([6, 3, 7, null]);
|
|
252
|
-
// expect(
|
|
253
|
-
// tree.subTreeTraverse(node => (node ? node.key : null), tree.getNode(6), IterationType.RECURSIVE, true)
|
|
254
|
-
// ).toEqual([6, 3, 7, null]);
|
|
255
|
-
// });
|
|
256
|
-
|
|
257
286
|
it('should sub tree traverse', () => {
|
|
258
287
|
tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
259
288
|
expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
|
|
@@ -613,7 +642,7 @@ describe('BinaryTree', () => {
|
|
|
613
642
|
tree.delete(5);
|
|
614
643
|
tree.delete(7);
|
|
615
644
|
tree.delete(3);
|
|
616
|
-
expect(tree.root).toBe(
|
|
645
|
+
expect(tree.root).toBe(undefined);
|
|
617
646
|
expect(tree.getHeight()).toBe(-1);
|
|
618
647
|
});
|
|
619
648
|
});
|
|
@@ -795,6 +795,70 @@ describe('BST operations test recursively', () => {
|
|
|
795
795
|
expect(bfsNodes[1].key).toBe(12);
|
|
796
796
|
expect(bfsNodes[2].key).toBe(16);
|
|
797
797
|
});
|
|
798
|
+
|
|
799
|
+
it('should delete', () => {
|
|
800
|
+
const numBST = new BST<number>();
|
|
801
|
+
numBST.addMany([2, 4, 5, 3, 1]);
|
|
802
|
+
expect(numBST.size).toBe(5);
|
|
803
|
+
numBST.delete(1);
|
|
804
|
+
expect(numBST.size).toBe(4);
|
|
805
|
+
|
|
806
|
+
numBST.delete(2);
|
|
807
|
+
numBST.delete(3);
|
|
808
|
+
numBST.delete(4);
|
|
809
|
+
numBST.delete(5);
|
|
810
|
+
expect(numBST.size).toBe(0);
|
|
811
|
+
numBST.delete(5);
|
|
812
|
+
expect(numBST.size).toBe(0);
|
|
813
|
+
});
|
|
814
|
+
|
|
815
|
+
it('should the clone method', () => {
|
|
816
|
+
function checkTreeStructure(bst: BST<string, number>) {
|
|
817
|
+
expect(bst.size).toBe(4);
|
|
818
|
+
expect(bst.root?.key).toBe('2');
|
|
819
|
+
expect(bst.root?.left?.key).toBe('1');
|
|
820
|
+
expect(bst.root?.left?.left?.key).toBe(undefined);
|
|
821
|
+
expect(bst.root?.left?.right?.key).toBe(undefined);
|
|
822
|
+
expect(bst.root?.right?.key).toBe('4');
|
|
823
|
+
expect(bst.root?.right?.left?.key).toBe(undefined);
|
|
824
|
+
expect(bst.root?.right?.right?.key).toBe('5');
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
const bst = new BST<string, number>();
|
|
828
|
+
bst.addMany([
|
|
829
|
+
['2', 2],
|
|
830
|
+
['4', 4],
|
|
831
|
+
['5', 5],
|
|
832
|
+
['3', 3],
|
|
833
|
+
['1', 1]
|
|
834
|
+
]);
|
|
835
|
+
expect(bst.size).toBe(5);
|
|
836
|
+
expect(bst.root?.key).toBe('3');
|
|
837
|
+
expect(bst.root?.left?.key).toBe('1');
|
|
838
|
+
expect(bst.root?.left?.left?.key).toBe(undefined);
|
|
839
|
+
expect(bst.root?.left?.right?.key).toBe('2');
|
|
840
|
+
expect(bst.root?.right?.key).toBe('4');
|
|
841
|
+
expect(bst.root?.right?.left?.key).toBe(undefined);
|
|
842
|
+
expect(bst.root?.right?.right?.key).toBe('5');
|
|
843
|
+
bst.delete('3');
|
|
844
|
+
checkTreeStructure(bst);
|
|
845
|
+
const cloned = bst.clone();
|
|
846
|
+
checkTreeStructure(cloned);
|
|
847
|
+
bst.delete('2');
|
|
848
|
+
bst.delete('1');
|
|
849
|
+
bst.delete('4');
|
|
850
|
+
bst.delete('5');
|
|
851
|
+
expect(bst.size).toBe(0);
|
|
852
|
+
|
|
853
|
+
cloned.delete('1');
|
|
854
|
+
expect(bst.size).toBe(0);
|
|
855
|
+
expect(cloned.size).toBe(3);
|
|
856
|
+
cloned.delete('2');
|
|
857
|
+
cloned.delete('3');
|
|
858
|
+
cloned.delete('4');
|
|
859
|
+
cloned.delete('5');
|
|
860
|
+
expect(cloned.size).toBe(0);
|
|
861
|
+
});
|
|
798
862
|
});
|
|
799
863
|
|
|
800
864
|
describe('BST isBST', function () {
|
|
@@ -865,7 +929,7 @@ describe('BST Performance test', function () {
|
|
|
865
929
|
// expect(bst.lastKey()).toBe(9);
|
|
866
930
|
});
|
|
867
931
|
|
|
868
|
-
it('should
|
|
932
|
+
it('should dfs as sub tree traversal, null should be ignored', () => {
|
|
869
933
|
const bst = new BST();
|
|
870
934
|
bst.addMany([4, 2, 6, 1, 3, 5, 7]);
|
|
871
935
|
expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), IterationType.ITERATIVE)).toEqual([6, 5, 7]);
|
|
@@ -138,9 +138,46 @@ describe('RedBlackTree', () => {
|
|
|
138
138
|
expect(predecessorNode).toBe(tree.getNode(10));
|
|
139
139
|
});
|
|
140
140
|
});
|
|
141
|
+
|
|
142
|
+
it('should the clone method', () => {
|
|
143
|
+
function checkTreeStructure(rbTree: RedBlackTree<string, number>) {
|
|
144
|
+
expect(rbTree.size).toBe(4);
|
|
145
|
+
expect(rbTree.root?.key).toBe('2');
|
|
146
|
+
expect(rbTree.root?.left?.key).toBe('1');
|
|
147
|
+
expect(rbTree.root?.left?.left?.key).toBe(NaN);
|
|
148
|
+
expect(rbTree.root?.left?.right?.key).toBe(NaN);
|
|
149
|
+
expect(rbTree.root?.right?.key).toBe('4');
|
|
150
|
+
expect(rbTree.root?.right?.left?.key).toBe(NaN);
|
|
151
|
+
expect(rbTree.root?.right?.right?.key).toBe('5');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const rbTree = new RedBlackTree<string, number>();
|
|
155
|
+
rbTree.addMany([
|
|
156
|
+
['2', 2],
|
|
157
|
+
['4', 4],
|
|
158
|
+
['5', 5],
|
|
159
|
+
['3', 3],
|
|
160
|
+
['1', 1]
|
|
161
|
+
]);
|
|
162
|
+
expect(rbTree.size).toBe(5);
|
|
163
|
+
expect(rbTree.root?.key).toBe('2');
|
|
164
|
+
expect(rbTree.root?.left?.key).toBe('1');
|
|
165
|
+
expect(rbTree.root?.left?.left?.key).toBe(NaN);
|
|
166
|
+
expect(rbTree.root?.left?.right?.key).toBe(NaN);
|
|
167
|
+
expect(rbTree.root?.right?.key).toBe('4');
|
|
168
|
+
expect(rbTree.root?.right?.left?.key).toBe('3');
|
|
169
|
+
expect(rbTree.root?.right?.right?.key).toBe('5');
|
|
170
|
+
rbTree.delete('3');
|
|
171
|
+
checkTreeStructure(rbTree);
|
|
172
|
+
const cloned = rbTree.clone();
|
|
173
|
+
checkTreeStructure(cloned);
|
|
174
|
+
cloned.delete('1');
|
|
175
|
+
expect(rbTree.size).toBe(4);
|
|
176
|
+
expect(cloned.size).toBe(3);
|
|
177
|
+
});
|
|
141
178
|
});
|
|
142
179
|
|
|
143
|
-
describe('RedBlackTree', () => {
|
|
180
|
+
describe('RedBlackTree 2', () => {
|
|
144
181
|
let tree: RedBlackTree<number>;
|
|
145
182
|
|
|
146
183
|
beforeEach(() => {
|