data-structure-typed 1.53.0 → 1.53.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 +1 -1
- package/benchmark/report.html +1 -37
- package/benchmark/report.json +23 -383
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +2 -2
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.js +5 -3
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +7 -3
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/mjs/constants/index.js +1 -0
- package/dist/mjs/constants/index.js.map +1 -0
- package/dist/mjs/data-structures/base/index.js +1 -0
- package/dist/mjs/data-structures/base/index.js.map +1 -0
- package/dist/mjs/data-structures/base/iterable-element-base.js +1 -0
- package/dist/mjs/data-structures/base/iterable-element-base.js.map +1 -0
- package/dist/mjs/data-structures/base/iterable-entry-base.js +1 -0
- package/dist/mjs/data-structures/base/iterable-entry-base.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +2 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +2 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +1 -0
- package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +3 -2
- package/dist/mjs/data-structures/binary-tree/binary-tree.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/bst.js +6 -3
- package/dist/mjs/data-structures/binary-tree/bst.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/index.js +1 -0
- package/dist/mjs/data-structures/binary-tree/index.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +8 -3
- package/dist/mjs/data-structures/binary-tree/rb-tree.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/segment-tree.js +1 -0
- package/dist/mjs/data-structures/binary-tree/segment-tree.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +2 -1
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js.map +1 -0
- package/dist/mjs/data-structures/graph/abstract-graph.js +1 -0
- package/dist/mjs/data-structures/graph/abstract-graph.js.map +1 -0
- package/dist/mjs/data-structures/graph/directed-graph.js +1 -0
- package/dist/mjs/data-structures/graph/directed-graph.js.map +1 -0
- package/dist/mjs/data-structures/graph/index.js +1 -0
- package/dist/mjs/data-structures/graph/index.js.map +1 -0
- package/dist/mjs/data-structures/graph/map-graph.js +1 -0
- package/dist/mjs/data-structures/graph/map-graph.js.map +1 -0
- package/dist/mjs/data-structures/graph/undirected-graph.js +1 -0
- package/dist/mjs/data-structures/graph/undirected-graph.js.map +1 -0
- package/dist/mjs/data-structures/hash/hash-map.js +1 -0
- package/dist/mjs/data-structures/hash/hash-map.js.map +1 -0
- package/dist/mjs/data-structures/hash/index.js +1 -0
- package/dist/mjs/data-structures/hash/index.js.map +1 -0
- package/dist/mjs/data-structures/heap/heap.js +1 -0
- package/dist/mjs/data-structures/heap/heap.js.map +1 -0
- package/dist/mjs/data-structures/heap/index.js +1 -0
- package/dist/mjs/data-structures/heap/index.js.map +1 -0
- package/dist/mjs/data-structures/heap/max-heap.js +1 -0
- package/dist/mjs/data-structures/heap/max-heap.js.map +1 -0
- package/dist/mjs/data-structures/heap/min-heap.js +1 -0
- package/dist/mjs/data-structures/heap/min-heap.js.map +1 -0
- package/dist/mjs/data-structures/index.js +1 -0
- package/dist/mjs/data-structures/index.js.map +1 -0
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +1 -0
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js.map +1 -0
- package/dist/mjs/data-structures/linked-list/index.js +1 -0
- package/dist/mjs/data-structures/linked-list/index.js.map +1 -0
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +1 -0
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js.map +1 -0
- package/dist/mjs/data-structures/linked-list/skip-linked-list.js +1 -0
- package/dist/mjs/data-structures/linked-list/skip-linked-list.js.map +1 -0
- package/dist/mjs/data-structures/matrix/index.js +1 -0
- package/dist/mjs/data-structures/matrix/index.js.map +1 -0
- package/dist/mjs/data-structures/matrix/matrix.js +1 -0
- package/dist/mjs/data-structures/matrix/matrix.js.map +1 -0
- package/dist/mjs/data-structures/matrix/navigator.js +1 -0
- package/dist/mjs/data-structures/matrix/navigator.js.map +1 -0
- package/dist/mjs/data-structures/priority-queue/index.js +1 -0
- package/dist/mjs/data-structures/priority-queue/index.js.map +1 -0
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +1 -0
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.js.map +1 -0
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +1 -0
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.js.map +1 -0
- package/dist/mjs/data-structures/priority-queue/priority-queue.js +1 -0
- package/dist/mjs/data-structures/priority-queue/priority-queue.js.map +1 -0
- package/dist/mjs/data-structures/queue/deque.js +1 -0
- package/dist/mjs/data-structures/queue/deque.js.map +1 -0
- package/dist/mjs/data-structures/queue/index.js +1 -0
- package/dist/mjs/data-structures/queue/index.js.map +1 -0
- package/dist/mjs/data-structures/queue/queue.js +1 -0
- package/dist/mjs/data-structures/queue/queue.js.map +1 -0
- package/dist/mjs/data-structures/stack/index.js +1 -0
- package/dist/mjs/data-structures/stack/index.js.map +1 -0
- package/dist/mjs/data-structures/stack/stack.js +1 -0
- package/dist/mjs/data-structures/stack/stack.js.map +1 -0
- package/dist/mjs/data-structures/tree/index.js +1 -0
- package/dist/mjs/data-structures/tree/index.js.map +1 -0
- package/dist/mjs/data-structures/tree/tree.js +1 -0
- package/dist/mjs/data-structures/tree/tree.js.map +1 -0
- package/dist/mjs/data-structures/trie/index.js +1 -0
- package/dist/mjs/data-structures/trie/index.js.map +1 -0
- package/dist/mjs/data-structures/trie/trie.js +1 -0
- package/dist/mjs/data-structures/trie/trie.js.map +1 -0
- package/dist/mjs/index.js +1 -0
- package/dist/mjs/index.js.map +1 -0
- package/dist/mjs/interfaces/binary-tree.js +1 -0
- package/dist/mjs/interfaces/binary-tree.js.map +1 -0
- package/dist/mjs/interfaces/doubly-linked-list.js +1 -0
- package/dist/mjs/interfaces/doubly-linked-list.js.map +1 -0
- package/dist/mjs/interfaces/graph.js +1 -0
- package/dist/mjs/interfaces/graph.js.map +1 -0
- package/dist/mjs/interfaces/heap.js +1 -0
- package/dist/mjs/interfaces/heap.js.map +1 -0
- package/dist/mjs/interfaces/index.js +1 -0
- package/dist/mjs/interfaces/index.js.map +1 -0
- package/dist/mjs/interfaces/navigator.js +1 -0
- package/dist/mjs/interfaces/navigator.js.map +1 -0
- package/dist/mjs/interfaces/priority-queue.js +1 -0
- package/dist/mjs/interfaces/priority-queue.js.map +1 -0
- package/dist/mjs/interfaces/segment-tree.js +1 -0
- package/dist/mjs/interfaces/segment-tree.js.map +1 -0
- package/dist/mjs/interfaces/singly-linked-list.js +1 -0
- package/dist/mjs/interfaces/singly-linked-list.js.map +1 -0
- package/dist/mjs/types/common.js +1 -0
- package/dist/mjs/types/common.js.map +1 -0
- package/dist/mjs/types/data-structures/base/base.js +1 -0
- package/dist/mjs/types/data-structures/base/base.js.map +1 -0
- package/dist/mjs/types/data-structures/base/index.js +1 -0
- package/dist/mjs/types/data-structures/base/index.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/avl-tree.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/avl-tree.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/binary-indexed-tree.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/binary-indexed-tree.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/bst.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/bst.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/index.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/index.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/rb-tree.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/rb-tree.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/segment-tree.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/segment-tree.js.map +1 -0
- package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.js +1 -0
- package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.js.map +1 -0
- package/dist/mjs/types/data-structures/graph/abstract-graph.js +1 -0
- package/dist/mjs/types/data-structures/graph/abstract-graph.js.map +1 -0
- package/dist/mjs/types/data-structures/graph/directed-graph.js +1 -0
- package/dist/mjs/types/data-structures/graph/directed-graph.js.map +1 -0
- package/dist/mjs/types/data-structures/graph/index.js +1 -0
- package/dist/mjs/types/data-structures/graph/index.js.map +1 -0
- package/dist/mjs/types/data-structures/graph/map-graph.js +1 -0
- package/dist/mjs/types/data-structures/graph/map-graph.js.map +1 -0
- package/dist/mjs/types/data-structures/graph/undirected-graph.js +1 -0
- package/dist/mjs/types/data-structures/graph/undirected-graph.js.map +1 -0
- package/dist/mjs/types/data-structures/hash/hash-map.js +1 -0
- package/dist/mjs/types/data-structures/hash/hash-map.js.map +1 -0
- package/dist/mjs/types/data-structures/hash/index.js +1 -0
- package/dist/mjs/types/data-structures/hash/index.js.map +1 -0
- package/dist/mjs/types/data-structures/heap/heap.js +1 -0
- package/dist/mjs/types/data-structures/heap/heap.js.map +1 -0
- package/dist/mjs/types/data-structures/heap/index.js +1 -0
- package/dist/mjs/types/data-structures/heap/index.js.map +1 -0
- package/dist/mjs/types/data-structures/heap/max-heap.js +1 -0
- package/dist/mjs/types/data-structures/heap/max-heap.js.map +1 -0
- package/dist/mjs/types/data-structures/heap/min-heap.js +1 -0
- package/dist/mjs/types/data-structures/heap/min-heap.js.map +1 -0
- package/dist/mjs/types/data-structures/index.js +1 -0
- package/dist/mjs/types/data-structures/index.js.map +1 -0
- package/dist/mjs/types/data-structures/linked-list/doubly-linked-list.js +1 -0
- package/dist/mjs/types/data-structures/linked-list/doubly-linked-list.js.map +1 -0
- package/dist/mjs/types/data-structures/linked-list/index.js +1 -0
- package/dist/mjs/types/data-structures/linked-list/index.js.map +1 -0
- package/dist/mjs/types/data-structures/linked-list/singly-linked-list.js +1 -0
- package/dist/mjs/types/data-structures/linked-list/singly-linked-list.js.map +1 -0
- package/dist/mjs/types/data-structures/linked-list/skip-linked-list.js +1 -0
- package/dist/mjs/types/data-structures/linked-list/skip-linked-list.js.map +1 -0
- package/dist/mjs/types/data-structures/matrix/index.js +1 -0
- package/dist/mjs/types/data-structures/matrix/index.js.map +1 -0
- package/dist/mjs/types/data-structures/matrix/matrix.js +1 -0
- package/dist/mjs/types/data-structures/matrix/matrix.js.map +1 -0
- package/dist/mjs/types/data-structures/matrix/navigator.js +1 -0
- package/dist/mjs/types/data-structures/matrix/navigator.js.map +1 -0
- package/dist/mjs/types/data-structures/priority-queue/index.js +1 -0
- package/dist/mjs/types/data-structures/priority-queue/index.js.map +1 -0
- package/dist/mjs/types/data-structures/priority-queue/max-priority-queue.js +1 -0
- package/dist/mjs/types/data-structures/priority-queue/max-priority-queue.js.map +1 -0
- package/dist/mjs/types/data-structures/priority-queue/min-priority-queue.js +1 -0
- package/dist/mjs/types/data-structures/priority-queue/min-priority-queue.js.map +1 -0
- package/dist/mjs/types/data-structures/priority-queue/priority-queue.js +1 -0
- package/dist/mjs/types/data-structures/priority-queue/priority-queue.js.map +1 -0
- package/dist/mjs/types/data-structures/queue/deque.js +1 -0
- package/dist/mjs/types/data-structures/queue/deque.js.map +1 -0
- package/dist/mjs/types/data-structures/queue/index.js +1 -0
- package/dist/mjs/types/data-structures/queue/index.js.map +1 -0
- package/dist/mjs/types/data-structures/queue/queue.js +1 -0
- package/dist/mjs/types/data-structures/queue/queue.js.map +1 -0
- package/dist/mjs/types/data-structures/stack/index.js +1 -0
- package/dist/mjs/types/data-structures/stack/index.js.map +1 -0
- package/dist/mjs/types/data-structures/stack/stack.js +1 -0
- package/dist/mjs/types/data-structures/stack/stack.js.map +1 -0
- package/dist/mjs/types/data-structures/tree/index.js +1 -0
- package/dist/mjs/types/data-structures/tree/index.js.map +1 -0
- package/dist/mjs/types/data-structures/tree/tree.js +1 -0
- package/dist/mjs/types/data-structures/tree/tree.js.map +1 -0
- package/dist/mjs/types/data-structures/trie/index.js +1 -0
- package/dist/mjs/types/data-structures/trie/index.js.map +1 -0
- package/dist/mjs/types/data-structures/trie/trie.js +1 -0
- package/dist/mjs/types/data-structures/trie/trie.js.map +1 -0
- package/dist/mjs/types/index.js +1 -0
- package/dist/mjs/types/index.js.map +1 -0
- package/dist/mjs/types/utils/index.js +1 -0
- package/dist/mjs/types/utils/index.js.map +1 -0
- package/dist/mjs/types/utils/utils.js +1 -0
- package/dist/mjs/types/utils/utils.js.map +1 -0
- package/dist/mjs/types/utils/validate-type.js +1 -0
- package/dist/mjs/types/utils/validate-type.js.map +1 -0
- package/dist/mjs/utils/index.js +1 -0
- package/dist/mjs/utils/index.js.map +1 -0
- package/dist/mjs/utils/number.js +1 -0
- package/dist/mjs/utils/number.js.map +1 -0
- package/dist/mjs/utils/utils.js +1 -0
- package/dist/mjs/utils/utils.js.map +1 -0
- package/dist/umd/data-structure-typed.js +16 -10
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +7 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +1 -1
- package/src/data-structures/binary-tree/avl-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +2 -2
- package/src/data-structures/binary-tree/bst.ts +4 -3
- package/src/data-structures/binary-tree/rb-tree.ts +7 -2
- package/src/data-structures/binary-tree/tree-multi-map.ts +1 -1
- package/src/types/data-structures/binary-tree/binary-tree.ts +3 -3
- package/src/types/data-structures/binary-tree/bst.ts +1 -1
- package/test/performance/data-structures/binary-tree/avl-tree.test.ts +1 -1
- package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +2 -2
- package/test/performance/data-structures/binary-tree/binary-tree.test.ts +1 -1
- package/test/performance/data-structures/binary-tree/bst.test.ts +1 -1
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +9 -1
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +8 -8
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +28 -9
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +36 -22
- package/test/unit/data-structures/binary-tree/bst.test.ts +33 -14
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +19 -0
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +11 -11
- package/test/unit/data-structures/graph/directed-graph.test.ts +14 -0
- package/test/utils/array.ts +15 -12
- package/tsconfig-mjs.json +1 -1
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "data-structure-typed",
|
|
3
|
-
"version": "1.53.
|
|
3
|
+
"version": "1.53.2",
|
|
4
4
|
"description": "Javascript Data Structure. Heap, Binary Tree, Red Black Tree, Linked List, Deque, Trie, HashMap, Directed Graph, Undirected Graph, Binary Search Tree(BST), AVL Tree, Priority Queue, Graph, Queue, Tree Multiset, Singly Linked List, Doubly Linked List, Max Heap, Max Priority Queue, Min Heap, Min Priority Queue, Stack. Benchmark compared with C++ STL. API aligned with ES6 and Java.util. Usability is comparable to Python",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/mjs/index.js",
|
|
7
|
+
"browser": "dist/umd/data-structure-typed.min.js",
|
|
7
8
|
"types": "dist/mjs/index.d.ts",
|
|
8
9
|
"umd:main": "dist/umd/data-structure-typed.min.js",
|
|
9
10
|
"exports": {
|
|
@@ -68,11 +69,11 @@
|
|
|
68
69
|
"@typescript-eslint/eslint-plugin": "^8.12.1",
|
|
69
70
|
"@typescript-eslint/parser": "^8.12.1",
|
|
70
71
|
"auto-changelog": "^2.5.0",
|
|
71
|
-
"avl-tree-typed": "^1.
|
|
72
|
+
"avl-tree-typed": "^1.53.1",
|
|
72
73
|
"benchmark": "^2.1.4",
|
|
73
|
-
"binary-tree-typed": "^1.
|
|
74
|
-
"bst-typed": "^1.
|
|
75
|
-
"data-structure-typed": "^1.
|
|
74
|
+
"binary-tree-typed": "^1.53.1",
|
|
75
|
+
"bst-typed": "^1.53.1",
|
|
76
|
+
"data-structure-typed": "^1.53.1",
|
|
76
77
|
"dependency-cruiser": "^16.5.0",
|
|
77
78
|
"doctoc": "^2.2.1",
|
|
78
79
|
"eslint": "^9.13.0",
|
|
@@ -81,7 +82,7 @@
|
|
|
81
82
|
"eslint-import-resolver-typescript": "^3.6.3",
|
|
82
83
|
"eslint-plugin-import": "^2.31.0",
|
|
83
84
|
"fast-glob": "^3.3.2",
|
|
84
|
-
"heap-typed": "^1.
|
|
85
|
+
"heap-typed": "^1.53.1",
|
|
85
86
|
"istanbul-badges-readme": "^1.9.0",
|
|
86
87
|
"jest": "^29.7.0",
|
|
87
88
|
"js-sdsl": "^4.4.2",
|
|
@@ -129,7 +129,7 @@ export class AVLTreeMultiMap<
|
|
|
129
129
|
* @returns a new instance of the AVLTreeMultiMapNode class, casted as NODE.
|
|
130
130
|
*/
|
|
131
131
|
override createNode(key: K, value?: V, count?: number): NODE {
|
|
132
|
-
return new AVLTreeMultiMapNode(key, value, count) as NODE;
|
|
132
|
+
return new AVLTreeMultiMapNode(key, this._isMapMode ? undefined : value, count) as NODE;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
/**
|
|
@@ -99,7 +99,7 @@ export class AVLTree<
|
|
|
99
99
|
* type NODE.
|
|
100
100
|
*/
|
|
101
101
|
override createNode(key: K, value?: V): NODE {
|
|
102
|
-
return new AVLTreeNode<K, V, NODE>(key, value) as NODE;
|
|
102
|
+
return new AVLTreeNode<K, V, NODE>(key, this._isMapMode ? undefined : value) as NODE;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
/**
|
|
@@ -135,7 +135,7 @@ export class BinaryTree<
|
|
|
135
135
|
if (keysNodesEntriesOrRaws) this.addMany(keysNodesEntriesOrRaws);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
protected _isMapMode =
|
|
138
|
+
protected _isMapMode = true;
|
|
139
139
|
|
|
140
140
|
get isMapMode() {
|
|
141
141
|
return this._isMapMode;
|
|
@@ -181,7 +181,7 @@ export class BinaryTree<
|
|
|
181
181
|
* as NODE.
|
|
182
182
|
*/
|
|
183
183
|
createNode(key: K, value?: V): NODE {
|
|
184
|
-
return new BinaryTreeNode<K, V, NODE>(key, value) as NODE;
|
|
184
|
+
return new BinaryTreeNode<K, V, NODE>(key, this._isMapMode ? undefined : value) as NODE;
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
/**
|
|
@@ -141,7 +141,7 @@ export class BST<
|
|
|
141
141
|
* @returns The method is returning a new instance of the BSTNode class, casted as the NODE type.
|
|
142
142
|
*/
|
|
143
143
|
override createNode(key: K, value?: V): NODE {
|
|
144
|
-
return new BSTNode<K, V, NODE>(key, value) as NODE;
|
|
144
|
+
return new BSTNode<K, V, NODE>(key, this._isMapMode ? undefined : value) as NODE;
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
/**
|
|
@@ -174,9 +174,9 @@ export class BST<
|
|
|
174
174
|
keyNodeEntryOrRaw: BTNRep<K, V, NODE> | R,
|
|
175
175
|
value?: V
|
|
176
176
|
): [OptNode<NODE>, V | undefined] {
|
|
177
|
-
const [node,
|
|
177
|
+
const [node, entryValue] = super.keyValueNodeEntryRawToNodeAndValue(keyNodeEntryOrRaw, value);
|
|
178
178
|
if (node === null) return [undefined, undefined];
|
|
179
|
-
return [node,
|
|
179
|
+
return [node, value ?? entryValue];
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
/**
|
|
@@ -250,6 +250,7 @@ export class BST<
|
|
|
250
250
|
while (current !== undefined) {
|
|
251
251
|
if (this.comparator(current.key, newNode.key) === 0) {
|
|
252
252
|
this._replaceNode(current, newNode);
|
|
253
|
+
if (this._isMapMode) this._setValue(current.key, newValue);
|
|
253
254
|
return true;
|
|
254
255
|
} else if (this.comparator(current.key, newNode.key) > 0) {
|
|
255
256
|
if (current.left === undefined) {
|
|
@@ -106,7 +106,7 @@ export class RedBlackTree<
|
|
|
106
106
|
* returned.
|
|
107
107
|
*/
|
|
108
108
|
override createNode(key: K, value?: V, color: RBTNColor = 'BLACK'): NODE {
|
|
109
|
-
return new RedBlackTreeNode<K, V, NODE>(key, value, color) as NODE;
|
|
109
|
+
return new RedBlackTreeNode<K, V, NODE>(key, this._isMapMode ? undefined : value, color) as NODE;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
/**
|
|
@@ -218,7 +218,12 @@ export class RedBlackTree<
|
|
|
218
218
|
if (this._isMapMode) this._setValue(newNode.key, newValue);
|
|
219
219
|
this._size++;
|
|
220
220
|
return true;
|
|
221
|
-
}
|
|
221
|
+
}
|
|
222
|
+
if (insertStatus === 'UPDATED') {
|
|
223
|
+
if (this._isMapMode) this._setValue(newNode.key, newValue);
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
return false;
|
|
222
227
|
}
|
|
223
228
|
|
|
224
229
|
/**
|
|
@@ -124,7 +124,7 @@ export class TreeMultiMap<
|
|
|
124
124
|
* @returns A new instance of the TreeMultiMapNode class, casted as NODE.
|
|
125
125
|
*/
|
|
126
126
|
override createNode(key: K, value?: V, color: RBTNColor = 'BLACK', count?: number): NODE {
|
|
127
|
-
return new TreeMultiMapNode(key, value, count, color) as NODE;
|
|
127
|
+
return new TreeMultiMapNode(key, this._isMapMode ? undefined : value, count, color) as NODE;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
/**
|
|
@@ -9,9 +9,9 @@ export type BinaryTreeNested<K, V, R, NODE extends BinaryTreeNode<K, V, NODE>> =
|
|
|
9
9
|
export type ToEntryFn<K, V, R> = (rawElement: R) => BTNEntry<K, V>;
|
|
10
10
|
|
|
11
11
|
export type BinaryTreeOptions<K, V, R> = {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
iterationType?: IterationType;
|
|
13
|
+
toEntryFn?: ToEntryFn<K, V, R>;
|
|
14
|
+
isMapMode?: boolean;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export type BinaryTreePrintOptions = { isShowUndefined?: boolean; isShowNull?: boolean; isShowRedBlackNIL?: boolean };
|
|
@@ -7,7 +7,7 @@ export type BSTNodeNested<K, V> = BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTN
|
|
|
7
7
|
export type BSTNested<K, V, R, NODE extends BSTNode<K, V, NODE>> = BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
8
8
|
|
|
9
9
|
export type BSTOptions<K, V, R> = BinaryTreeOptions<K, V, R> & {
|
|
10
|
-
|
|
10
|
+
comparator?: Comparator<K>
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export type BSTNOptKey<K> = K | undefined;
|
|
@@ -3,7 +3,7 @@ import * as Benchmark from 'benchmark';
|
|
|
3
3
|
import { getRandomIntArray, magnitude } from '../../../utils';
|
|
4
4
|
|
|
5
5
|
const suite = new Benchmark.Suite();
|
|
6
|
-
const avlTree = new AVLTree<number>(
|
|
6
|
+
const avlTree = new AVLTree<number>();
|
|
7
7
|
const { HUNDRED_THOUSAND } = magnitude;
|
|
8
8
|
const randomArray = getRandomIntArray(HUNDRED_THOUSAND, 0, HUNDRED_THOUSAND - 1, true);
|
|
9
9
|
|
|
@@ -3,8 +3,8 @@ import * as Benchmark from 'benchmark';
|
|
|
3
3
|
import { getRandomIntArray, magnitude } from '../../../utils';
|
|
4
4
|
|
|
5
5
|
const suite = new Benchmark.Suite();
|
|
6
|
-
const rbTree = new RedBlackTree<number>(
|
|
7
|
-
const avlTree = new AVLTree<number>(
|
|
6
|
+
const rbTree = new RedBlackTree<number>();
|
|
7
|
+
const avlTree = new AVLTree<number>();
|
|
8
8
|
const { TEN_THOUSAND } = magnitude;
|
|
9
9
|
const arr = getRandomIntArray(TEN_THOUSAND, 0, TEN_THOUSAND - 1, true);
|
|
10
10
|
|
|
@@ -3,7 +3,7 @@ import * as Benchmark from 'benchmark';
|
|
|
3
3
|
import { getRandomIntArray, magnitude } from '../../../utils';
|
|
4
4
|
|
|
5
5
|
const suite = new Benchmark.Suite();
|
|
6
|
-
const biTree = new BinaryTree<number>(
|
|
6
|
+
const biTree = new BinaryTree<number>();
|
|
7
7
|
const { THOUSAND } = magnitude;
|
|
8
8
|
const arr = getRandomIntArray(THOUSAND, 0, THOUSAND, true);
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ import * as Benchmark from 'benchmark';
|
|
|
3
3
|
import { getRandomIntArray, magnitude } from '../../../utils';
|
|
4
4
|
|
|
5
5
|
const suite = new Benchmark.Suite();
|
|
6
|
-
const bst = new BST<number>(
|
|
6
|
+
const bst = new BST<number>();
|
|
7
7
|
const { TEN_THOUSAND } = magnitude;
|
|
8
8
|
const arr = getRandomIntArray(TEN_THOUSAND, 0, TEN_THOUSAND, true);
|
|
9
9
|
|
|
@@ -5,7 +5,8 @@ import { OrderedMap } from 'js-sdsl';
|
|
|
5
5
|
import { isCompetitor } from '../../../config';
|
|
6
6
|
|
|
7
7
|
const suite = new Benchmark.Suite();
|
|
8
|
-
const rbTree = new RedBlackTree<number>(
|
|
8
|
+
const rbTree = new RedBlackTree<number>();
|
|
9
|
+
const rbTreeNodeMode = new RedBlackTree<number>([], { isMapMode: false });
|
|
9
10
|
const { HUNDRED_THOUSAND } = magnitude;
|
|
10
11
|
const randomArray = getRandomIntArray(HUNDRED_THOUSAND, 0, HUNDRED_THOUSAND - 1, true);
|
|
11
12
|
const cOrderedMap = new OrderedMap<number, number>();
|
|
@@ -22,6 +23,13 @@ suite
|
|
|
22
23
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} get`, () => {
|
|
23
24
|
for (let i = 0; i < randomArray.length; i++) rbTree.get(randomArray[i]);
|
|
24
25
|
})
|
|
26
|
+
.add(`${HUNDRED_THOUSAND.toLocaleString()} node mode add randomly`, () => {
|
|
27
|
+
rbTreeNodeMode.clear();
|
|
28
|
+
for (let i = 0; i < randomArray.length; i++) rbTree.add(randomArray[i]);
|
|
29
|
+
})
|
|
30
|
+
.add(`${HUNDRED_THOUSAND.toLocaleString()} node mode get`, () => {
|
|
31
|
+
for (let i = 0; i < randomArray.length; i++) rbTreeNodeMode.get(randomArray[i]);
|
|
32
|
+
})
|
|
25
33
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} iterator`, () => {
|
|
26
34
|
const entries = [...rbTree];
|
|
27
35
|
return entries.length === HUNDRED_THOUSAND;
|
|
@@ -75,7 +75,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
75
75
|
const nodeId10 = treeMultimap.getNode(10);
|
|
76
76
|
expect(nodeId10?.key).toBe(10);
|
|
77
77
|
|
|
78
|
-
const nodeVal9 = treeMultimap.getNode(node => node.
|
|
78
|
+
const nodeVal9 = treeMultimap.getNode(node => node.key === 9);
|
|
79
79
|
expect(nodeVal9?.key).toBe(9);
|
|
80
80
|
|
|
81
81
|
const nodesByCount1 = treeMultimap.getNodes(node => node.count === 1);
|
|
@@ -331,7 +331,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
331
331
|
const nodeId10 = treeMultimap.getNode(10);
|
|
332
332
|
expect(nodeId10?.key).toBe(10);
|
|
333
333
|
|
|
334
|
-
const nodeVal9 = treeMultimap.getNode(node => node.
|
|
334
|
+
const nodeVal9 = treeMultimap.getNode(node => node.key === 9);
|
|
335
335
|
expect(nodeVal9?.key).toBe(9);
|
|
336
336
|
|
|
337
337
|
const nodesByCount1 = treeMultimap.getNodes(node => node.count === 1);
|
|
@@ -762,10 +762,10 @@ describe('AVLTree toEntryFn', () => {
|
|
|
762
762
|
});
|
|
763
763
|
});
|
|
764
764
|
|
|
765
|
-
describe('AVLTreeMultiMap map mode count', () => {
|
|
765
|
+
describe('AVLTreeMultiMap not map mode count', () => {
|
|
766
766
|
let tm: AVLTreeMultiMap<number>;
|
|
767
767
|
beforeEach(() => {
|
|
768
|
-
tm = new AVLTreeMultiMap<number>([], { isMapMode:
|
|
768
|
+
tm = new AVLTreeMultiMap<number>([], { isMapMode: false });
|
|
769
769
|
});
|
|
770
770
|
it('Should added isolated node count ', () => {
|
|
771
771
|
tm.addMany([
|
|
@@ -781,9 +781,9 @@ describe('AVLTreeMultiMap map mode count', () => {
|
|
|
781
781
|
});
|
|
782
782
|
});
|
|
783
783
|
|
|
784
|
-
describe('AVLTreeMultiMap map mode operations test1', () => {
|
|
784
|
+
describe('AVLTreeMultiMap not map mode operations test1', () => {
|
|
785
785
|
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
786
|
-
const treeMultimap = new AVLTreeMultiMap<number>([], { isMapMode:
|
|
786
|
+
const treeMultimap = new AVLTreeMultiMap<number>([], { isMapMode: false });
|
|
787
787
|
|
|
788
788
|
expect(treeMultimap instanceof AVLTreeMultiMap);
|
|
789
789
|
treeMultimap.add([11, 11]);
|
|
@@ -826,11 +826,11 @@ describe('AVLTreeMultiMap map mode operations test1', () => {
|
|
|
826
826
|
});
|
|
827
827
|
});
|
|
828
828
|
|
|
829
|
-
describe('AVLTreeMultiMap map mode operations test recursively1', () => {
|
|
829
|
+
describe('AVLTreeMultiMap not map mode operations test recursively1', () => {
|
|
830
830
|
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
831
831
|
const treeMultimap = new AVLTreeMultiMap<number>([], {
|
|
832
832
|
iterationType: 'RECURSIVE',
|
|
833
|
-
isMapMode:
|
|
833
|
+
isMapMode: false
|
|
834
834
|
});
|
|
835
835
|
|
|
836
836
|
expect(treeMultimap instanceof AVLTreeMultiMap);
|
|
@@ -32,7 +32,7 @@ describe('AVL Tree Test', () => {
|
|
|
32
32
|
expect(lesserSum).toBe(45);
|
|
33
33
|
|
|
34
34
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
35
|
-
expect(node15?.value).toBe(
|
|
35
|
+
expect(node15?.value).toBe(undefined);
|
|
36
36
|
const dfs = tree.dfs(node => node, 'IN');
|
|
37
37
|
expect(dfs[0].key).toBe(1);
|
|
38
38
|
expect(dfs[dfs.length - 1].key).toBe(16);
|
|
@@ -106,6 +106,25 @@ describe('AVL Tree Test', () => {
|
|
|
106
106
|
expect(lastBFSNodes[1].key).toBe(2);
|
|
107
107
|
expect(lastBFSNodes[2].key).toBe(16);
|
|
108
108
|
});
|
|
109
|
+
|
|
110
|
+
it('should replace value', () => {
|
|
111
|
+
const tree = new AVLTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
112
|
+
expect(tree.get(1)).toBe('1');
|
|
113
|
+
expect(tree.getNode(1)?.value).toBe('1');
|
|
114
|
+
tree.add(1, 'a');
|
|
115
|
+
expect(tree.get(1)).toBe('a');
|
|
116
|
+
tree.add([1, 'b']);
|
|
117
|
+
expect(tree.getNode(1)?.value).toBe('b');
|
|
118
|
+
expect(tree.get(1)).toBe('b');
|
|
119
|
+
const treeMap = new AVLTree<number>([4, 5, [1, '1'], 2, 3]);
|
|
120
|
+
expect(treeMap.get(1)).toBe('1');
|
|
121
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
122
|
+
treeMap.add(1, 'a');
|
|
123
|
+
expect(treeMap.get(1)).toBe('a');
|
|
124
|
+
treeMap.add([1, 'b']);
|
|
125
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
126
|
+
expect(treeMap.get(1)).toBe('b');
|
|
127
|
+
});
|
|
109
128
|
});
|
|
110
129
|
|
|
111
130
|
describe('AVL Tree Test recursively', () => {
|
|
@@ -139,7 +158,7 @@ describe('AVL Tree Test recursively', () => {
|
|
|
139
158
|
expect(lesserSum).toBe(45);
|
|
140
159
|
|
|
141
160
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
142
|
-
expect(node15?.value).toBe(
|
|
161
|
+
expect(node15?.value).toBe(undefined);
|
|
143
162
|
|
|
144
163
|
const dfs = tree.dfs(node => node, 'IN');
|
|
145
164
|
expect(dfs[0].key).toBe(1);
|
|
@@ -418,7 +437,7 @@ describe('AVLTree iterative methods test', () => {
|
|
|
418
437
|
it('should clone work well', () => {
|
|
419
438
|
const cloned = avl.clone();
|
|
420
439
|
expect(cloned.root?.left?.key).toBe(1);
|
|
421
|
-
expect(cloned.root?.right?.value).toBe(
|
|
440
|
+
expect(cloned.root?.right?.value).toBe(undefined);
|
|
422
441
|
});
|
|
423
442
|
|
|
424
443
|
it('should keys', () => {
|
|
@@ -437,10 +456,10 @@ describe('AVLTree iterative methods test', () => {
|
|
|
437
456
|
});
|
|
438
457
|
});
|
|
439
458
|
|
|
440
|
-
describe('AVL Tree map mode', () => {
|
|
459
|
+
describe('AVL Tree not map mode', () => {
|
|
441
460
|
it('should perform various operations on a AVL Tree', () => {
|
|
442
461
|
const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
443
|
-
const tree = new AVLTree<number>([], { isMapMode:
|
|
462
|
+
const tree = new AVLTree<number>([], { isMapMode: false });
|
|
444
463
|
|
|
445
464
|
for (const i of arr) tree.add([i, i]);
|
|
446
465
|
|
|
@@ -473,10 +492,10 @@ describe('AVL Tree map mode', () => {
|
|
|
473
492
|
});
|
|
474
493
|
});
|
|
475
494
|
|
|
476
|
-
describe('AVL Tree map mode test recursively', () => {
|
|
495
|
+
describe('AVL Tree not map mode test recursively', () => {
|
|
477
496
|
it('should perform various operations on a AVL Tree', () => {
|
|
478
497
|
const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
479
|
-
const tree = new AVLTree<number>([], { iterationType: 'RECURSIVE', isMapMode:
|
|
498
|
+
const tree = new AVLTree<number>([], { iterationType: 'RECURSIVE', isMapMode: false });
|
|
480
499
|
|
|
481
500
|
for (const i of arr) tree.add([i, i]);
|
|
482
501
|
|
|
@@ -508,10 +527,10 @@ describe('AVL Tree map mode test recursively', () => {
|
|
|
508
527
|
});
|
|
509
528
|
});
|
|
510
529
|
|
|
511
|
-
describe('AVLTree iterative methods map mode', () => {
|
|
530
|
+
describe('AVLTree iterative methods not map mode', () => {
|
|
512
531
|
let avl: AVLTree<number, string>;
|
|
513
532
|
beforeEach(() => {
|
|
514
|
-
avl = new AVLTree<number, string>([], { isMapMode:
|
|
533
|
+
avl = new AVLTree<number, string>([], { isMapMode: false });
|
|
515
534
|
avl.add([1, 'a']);
|
|
516
535
|
avl.add([2, 'b']);
|
|
517
536
|
avl.add([3, 'c']);
|
|
@@ -102,10 +102,10 @@ describe('BinaryTree addMany', () => {
|
|
|
102
102
|
],
|
|
103
103
|
[undefined, 22, 44, 33]
|
|
104
104
|
);
|
|
105
|
-
expect(tree.
|
|
106
|
-
expect(tree.getNodeByKey(3)
|
|
107
|
-
expect(tree.getNodeByKey(4)
|
|
108
|
-
expect(tree.getNodeByKey(1)
|
|
105
|
+
expect(tree.get(2)).toBe(22);
|
|
106
|
+
expect(tree.get(tree.getNodeByKey(3))).toBe(33);
|
|
107
|
+
expect(tree.get(tree.getNodeByKey(4))).toBe(44);
|
|
108
|
+
expect(tree.get(tree.getNodeByKey(1))).toBe(1);
|
|
109
109
|
});
|
|
110
110
|
|
|
111
111
|
it('should addMany undefined and null', () => {
|
|
@@ -193,7 +193,7 @@ describe('BinaryTree', () => {
|
|
|
193
193
|
const node4 = tree.getNode(4);
|
|
194
194
|
expect(tree.has(node4)).toBe(false);
|
|
195
195
|
expect(tree.has(node => node === node4)).toBe(false);
|
|
196
|
-
expect(tree.has(node => node.
|
|
196
|
+
expect(tree.has(node => node.key?.toString() === '3')).toBe(true);
|
|
197
197
|
});
|
|
198
198
|
|
|
199
199
|
it('should the clone method work fine', () => {
|
|
@@ -768,6 +768,25 @@ describe('BinaryTree', () => {
|
|
|
768
768
|
});
|
|
769
769
|
expect(bTree.keyValueNodeEntryRawToNodeAndValue({ obj: { id: 1 } })).toEqual([undefined, undefined]);
|
|
770
770
|
});
|
|
771
|
+
|
|
772
|
+
it('should replace value', () => {
|
|
773
|
+
const tree = new BinaryTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
774
|
+
expect(tree.get(1)).toBe('1');
|
|
775
|
+
expect(tree.getNode(1)?.value).toBe('1');
|
|
776
|
+
tree.add(1, 'a');
|
|
777
|
+
expect(tree.get(1)).toBe('a');
|
|
778
|
+
tree.add([1, 'b']);
|
|
779
|
+
expect(tree.getNode(1)?.value).toBe('b');
|
|
780
|
+
expect(tree.get(1)).toBe('b');
|
|
781
|
+
const treeMap = new BinaryTree<number>([4, 5, [1, '1'], 2, 3]);
|
|
782
|
+
expect(treeMap.get(1)).toBe('1');
|
|
783
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
784
|
+
treeMap.add(1, 'a');
|
|
785
|
+
expect(treeMap.get(1)).toBe('a');
|
|
786
|
+
treeMap.add([1, 'b']);
|
|
787
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
788
|
+
expect(treeMap.get(1)).toBe('b');
|
|
789
|
+
});
|
|
771
790
|
});
|
|
772
791
|
|
|
773
792
|
describe('BinaryTree ensureNode', () => {
|
|
@@ -1049,9 +1068,9 @@ describe('BinaryTree', () => {
|
|
|
1049
1068
|
const nodeB = tree.getNode(3);
|
|
1050
1069
|
|
|
1051
1070
|
expect(nodeA?.key).toBe(5);
|
|
1052
|
-
expect(nodeA?.value).toBe(
|
|
1071
|
+
expect(nodeA?.value).toBe(undefined);
|
|
1053
1072
|
expect(nodeB?.key).toBe(3);
|
|
1054
|
-
expect(nodeB
|
|
1073
|
+
expect(tree.get(nodeB)).toBe('B');
|
|
1055
1074
|
});
|
|
1056
1075
|
|
|
1057
1076
|
it('should return null when getting a non-existent node', () => {
|
|
@@ -1160,21 +1179,17 @@ describe('BinaryTree', () => {
|
|
|
1160
1179
|
tree.add([2, 'B']);
|
|
1161
1180
|
tree.add([null, 'null']);
|
|
1162
1181
|
|
|
1163
|
-
const nodes = tree.
|
|
1182
|
+
const nodes = tree.getNodes(node => node.key === 2);
|
|
1164
1183
|
|
|
1165
1184
|
expect(nodes.length).toBe(1);
|
|
1166
1185
|
expect(nodes[0].key).toBe(2);
|
|
1167
1186
|
|
|
1168
|
-
const nodesRec = tree.
|
|
1169
|
-
? tree.getNodes(node => node.key === 2, false, tree.root, 'RECURSIVE')
|
|
1170
|
-
: tree.getNodes(node => node.value === 'B', false, tree.root, 'RECURSIVE');
|
|
1187
|
+
const nodesRec = tree.getNodes(node => node.key === 2, false, tree.root, 'RECURSIVE');
|
|
1171
1188
|
|
|
1172
1189
|
expect(nodesRec.length).toBe(1);
|
|
1173
1190
|
expect(nodesRec[0].key).toBe(2);
|
|
1174
1191
|
|
|
1175
|
-
const nodesItr = tree.
|
|
1176
|
-
? tree.getNodes(node => node.key === 2, false, tree.root, 'ITERATIVE')
|
|
1177
|
-
: tree.getNodes(node => node.value === 'B', false, tree.root, 'ITERATIVE');
|
|
1192
|
+
const nodesItr = tree.getNodes(node => node.key === 2, false, tree.root, 'ITERATIVE');
|
|
1178
1193
|
|
|
1179
1194
|
expect(nodesItr.length).toBe(1);
|
|
1180
1195
|
expect(nodesItr[0].key).toBe(2);
|
|
@@ -1220,13 +1235,13 @@ describe('BinaryTree', () => {
|
|
|
1220
1235
|
});
|
|
1221
1236
|
});
|
|
1222
1237
|
|
|
1223
|
-
describe('BinaryTree map mode', () => {
|
|
1238
|
+
describe('BinaryTree not map mode', () => {
|
|
1224
1239
|
let tree: BinaryTree<number, string>;
|
|
1225
1240
|
|
|
1226
1241
|
beforeEach(() => {
|
|
1227
1242
|
tree = new BinaryTree<number, string>([], {
|
|
1228
1243
|
iterationType: 'RECURSIVE',
|
|
1229
|
-
isMapMode:
|
|
1244
|
+
isMapMode: false
|
|
1230
1245
|
});
|
|
1231
1246
|
});
|
|
1232
1247
|
|
|
@@ -1247,8 +1262,7 @@ describe('BinaryTree map mode', () => {
|
|
|
1247
1262
|
const node4 = tree.getNode(4);
|
|
1248
1263
|
expect(tree.has(node4)).toBe(false);
|
|
1249
1264
|
expect(tree.has(node => node === node4)).toBe(false);
|
|
1250
|
-
|
|
1251
|
-
else expect(tree.has(node => node.value?.toString() === '3')).toBe(true);
|
|
1265
|
+
expect(tree.has(node => node.value?.toString() === '3')).toBe(true);
|
|
1252
1266
|
});
|
|
1253
1267
|
|
|
1254
1268
|
it('should isSubtreeBST', () => {
|
|
@@ -1379,8 +1393,8 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
1379
1393
|
it('should clone work well', () => {
|
|
1380
1394
|
const cloned = binaryTree.clone();
|
|
1381
1395
|
expect(cloned.root?.left?.key).toBe(2);
|
|
1382
|
-
|
|
1383
|
-
|
|
1396
|
+
expect(cloned.root?.right?.value).toBe(undefined);
|
|
1397
|
+
expect(cloned.get(cloned.root?.right)).toBe('c');
|
|
1384
1398
|
});
|
|
1385
1399
|
|
|
1386
1400
|
it('should keys', () => {
|
|
@@ -1423,10 +1437,10 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
1423
1437
|
});
|
|
1424
1438
|
});
|
|
1425
1439
|
|
|
1426
|
-
describe('BinaryTree map mode iterative methods test', () => {
|
|
1440
|
+
describe('BinaryTree not map mode iterative methods test', () => {
|
|
1427
1441
|
let binaryTree: BinaryTree<number, string>;
|
|
1428
1442
|
beforeEach(() => {
|
|
1429
|
-
binaryTree = new BinaryTree<number, string>([], { isMapMode:
|
|
1443
|
+
binaryTree = new BinaryTree<number, string>([], { isMapMode: false });
|
|
1430
1444
|
binaryTree.add([1, 'a']);
|
|
1431
1445
|
binaryTree.add(2, 'b');
|
|
1432
1446
|
binaryTree.add([3, 'c']);
|
|
@@ -74,7 +74,7 @@ describe('BST operations test', () => {
|
|
|
74
74
|
const nodeId10 = bst.getNode(10);
|
|
75
75
|
expect(nodeId10?.key).toBe(10);
|
|
76
76
|
|
|
77
|
-
const nodeVal9 = bst.getNode(node => node.
|
|
77
|
+
const nodeVal9 = bst.getNode(node => node.key === 9);
|
|
78
78
|
expect(nodeVal9?.key).toBe(9);
|
|
79
79
|
|
|
80
80
|
const leftMost = bst.getLeftMost();
|
|
@@ -86,7 +86,7 @@ describe('BST operations test', () => {
|
|
|
86
86
|
const minNodeBySpecificNode = node15 && bst.getLeftMost(node => node, node15);
|
|
87
87
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
88
88
|
|
|
89
|
-
const nodes = bst.getNodes(node => node.
|
|
89
|
+
const nodes = bst.getNodes(node => node.key === 15);
|
|
90
90
|
expect(nodes.map(node => node.key)).toEqual([15]);
|
|
91
91
|
|
|
92
92
|
let subTreeSum = 0;
|
|
@@ -291,7 +291,7 @@ describe('BST operations test', () => {
|
|
|
291
291
|
expect(leftMost).toBe(1);
|
|
292
292
|
|
|
293
293
|
const node15 = objBST.getNode(15);
|
|
294
|
-
expect(node15
|
|
294
|
+
expect(objBST.get(node15)).toEqual({
|
|
295
295
|
name: 'Alice',
|
|
296
296
|
age: 15
|
|
297
297
|
});
|
|
@@ -470,6 +470,25 @@ describe('BST operations test', () => {
|
|
|
470
470
|
const nodeNull = bst.keyValueNodeEntryRawToNodeAndValue(null);
|
|
471
471
|
expect(nodeNull).toEqual([undefined, undefined]);
|
|
472
472
|
});
|
|
473
|
+
|
|
474
|
+
it('should replace value', () => {
|
|
475
|
+
const tree = new BST<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
476
|
+
expect(tree.get(1)).toBe('1');
|
|
477
|
+
expect(tree.getNode(1)?.value).toBe('1');
|
|
478
|
+
tree.add(1, 'a');
|
|
479
|
+
expect(tree.get(1)).toBe('a');
|
|
480
|
+
tree.add([1, 'b']);
|
|
481
|
+
expect(tree.getNode(1)?.value).toBe('b');
|
|
482
|
+
expect(tree.get(1)).toBe('b');
|
|
483
|
+
const treeMap = new BST<number>([4, 5, [1, '1'], 2, 3]);
|
|
484
|
+
expect(treeMap.get(1)).toBe('1');
|
|
485
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
486
|
+
treeMap.add(1, 'a');
|
|
487
|
+
expect(treeMap.get(1)).toBe('a');
|
|
488
|
+
treeMap.add([1, 'b']);
|
|
489
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
490
|
+
expect(treeMap.get(1)).toBe('b');
|
|
491
|
+
});
|
|
473
492
|
});
|
|
474
493
|
|
|
475
494
|
describe('BST operations test recursively', () => {
|
|
@@ -708,7 +727,7 @@ describe('BST operations test recursively', () => {
|
|
|
708
727
|
expect(leftMost).toBe(1);
|
|
709
728
|
|
|
710
729
|
const node15 = objBST.getNode(15);
|
|
711
|
-
expect(node15
|
|
730
|
+
expect(objBST.get(node15)).toEqual({
|
|
712
731
|
key: 15,
|
|
713
732
|
keyA: 15
|
|
714
733
|
});
|
|
@@ -1135,7 +1154,7 @@ describe('BST iterative methods test', () => {
|
|
|
1135
1154
|
it('should clone work well', () => {
|
|
1136
1155
|
const cloned = bst.clone();
|
|
1137
1156
|
expect(cloned.root?.left).toBe(undefined);
|
|
1138
|
-
expect(cloned.root?.right?.value).toBe(
|
|
1157
|
+
expect(cloned.root?.right?.value).toBe(undefined);
|
|
1139
1158
|
});
|
|
1140
1159
|
|
|
1141
1160
|
it('should keys', () => {
|
|
@@ -1210,13 +1229,13 @@ describe('BST iterative methods test', () => {
|
|
|
1210
1229
|
);
|
|
1211
1230
|
|
|
1212
1231
|
expect(balanced.leaves()).toEqual([1, 6, 4, 9]);
|
|
1213
|
-
expect(balanced.leaves(node => node
|
|
1232
|
+
expect(balanced.leaves(node => balanced.get(node))).toEqual(['a', 'f', 'd', 'i']);
|
|
1214
1233
|
});
|
|
1215
1234
|
});
|
|
1216
1235
|
|
|
1217
|
-
describe('BST operations map mode test', () => {
|
|
1236
|
+
describe('BST operations not map mode test', () => {
|
|
1218
1237
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
1219
|
-
const bst = new BST<number, number>([], { isMapMode:
|
|
1238
|
+
const bst = new BST<number, number>([], { isMapMode: false });
|
|
1220
1239
|
expect(bst).toBeInstanceOf(BST);
|
|
1221
1240
|
bst.add([11, 11]);
|
|
1222
1241
|
bst.add([3, 3]);
|
|
@@ -1269,7 +1288,7 @@ describe('BST operations map mode test', () => {
|
|
|
1269
1288
|
});
|
|
1270
1289
|
|
|
1271
1290
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
1272
|
-
const objBST = new BST<number, { name: string; age: number }>([], { isMapMode:
|
|
1291
|
+
const objBST = new BST<number, { name: string; age: number }>([], { isMapMode: false });
|
|
1273
1292
|
expect(objBST).toBeInstanceOf(BST);
|
|
1274
1293
|
objBST.add([11, { name: '11', age: 11 }]);
|
|
1275
1294
|
objBST.add([3, { name: '3', age: 3 }]);
|
|
@@ -1322,7 +1341,7 @@ describe('BST operations map mode test', () => {
|
|
|
1322
1341
|
});
|
|
1323
1342
|
|
|
1324
1343
|
it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
1325
|
-
const bst = new BST<number>([], { isMapMode:
|
|
1344
|
+
const bst = new BST<number>([], { isMapMode: false });
|
|
1326
1345
|
const node0 = bst.keyValueNodeEntryRawToNodeAndValue(0);
|
|
1327
1346
|
expect(node0).toEqual([
|
|
1328
1347
|
{
|
|
@@ -1343,11 +1362,11 @@ describe('BST operations map mode test', () => {
|
|
|
1343
1362
|
});
|
|
1344
1363
|
});
|
|
1345
1364
|
|
|
1346
|
-
describe('BST operations map mode test recursively', () => {
|
|
1365
|
+
describe('BST operations not map mode test recursively', () => {
|
|
1347
1366
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
1348
1367
|
const bst = new BST<number>([], {
|
|
1349
1368
|
iterationType: 'RECURSIVE',
|
|
1350
|
-
isMapMode:
|
|
1369
|
+
isMapMode: false
|
|
1351
1370
|
});
|
|
1352
1371
|
expect(bst).toBeInstanceOf(BST);
|
|
1353
1372
|
bst.add([11, 11]);
|
|
@@ -1375,7 +1394,7 @@ describe('BST operations map mode test recursively', () => {
|
|
|
1375
1394
|
});
|
|
1376
1395
|
|
|
1377
1396
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
1378
|
-
const objBST = new BST<number, { key: number; keyA: number }>([], { isMapMode:
|
|
1397
|
+
const objBST = new BST<number, { key: number; keyA: number }>([], { isMapMode: false });
|
|
1379
1398
|
expect(objBST).toBeInstanceOf(BST);
|
|
1380
1399
|
objBST.add([11, { key: 11, keyA: 11 }]);
|
|
1381
1400
|
objBST.add([3, { key: 3, keyA: 3 }]);
|
|
@@ -1429,7 +1448,7 @@ describe('BST operations map mode test recursively', () => {
|
|
|
1429
1448
|
});
|
|
1430
1449
|
});
|
|
1431
1450
|
|
|
1432
|
-
describe('BST iterative methods map mode test', () => {
|
|
1451
|
+
describe('BST iterative methods not map mode test', () => {
|
|
1433
1452
|
let bst: BST<number, string>;
|
|
1434
1453
|
beforeEach(() => {
|
|
1435
1454
|
bst = new BST();
|