data-structure-typed 1.42.8 → 1.43.0
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/README.md +18 -18
- package/benchmark/report.html +12 -12
- package/benchmark/report.json +106 -106
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.d.ts +88 -23
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js +88 -23
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.d.ts +180 -74
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js +415 -236
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/bst.d.ts +121 -66
- package/dist/cjs/src/data-structures/binary-tree/bst.js +121 -67
- package/dist/cjs/src/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +72 -5
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +95 -18
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/tree-multimap.d.ts +82 -43
- package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js +82 -43
- package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js.map +1 -1
- package/dist/cjs/src/data-structures/graph/abstract-graph.d.ts +139 -36
- package/dist/cjs/src/data-structures/graph/abstract-graph.js +147 -36
- package/dist/cjs/src/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/src/data-structures/graph/directed-graph.d.ts +126 -0
- package/dist/cjs/src/data-structures/graph/directed-graph.js +126 -0
- package/dist/cjs/src/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/src/data-structures/graph/undirected-graph.d.ts +63 -0
- package/dist/cjs/src/data-structures/graph/undirected-graph.js +63 -0
- package/dist/cjs/src/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/src/data-structures/heap/heap.d.ts +175 -12
- package/dist/cjs/src/data-structures/heap/heap.js +175 -12
- package/dist/cjs/src/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/src/data-structures/linked-list/doubly-linked-list.d.ts +203 -0
- package/dist/cjs/src/data-structures/linked-list/doubly-linked-list.js +203 -0
- package/dist/cjs/src/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/src/data-structures/linked-list/singly-linked-list.d.ts +182 -0
- package/dist/cjs/src/data-structures/linked-list/singly-linked-list.js +182 -0
- package/dist/cjs/src/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/src/data-structures/linked-list/skip-linked-list.d.ts +64 -0
- package/dist/cjs/src/data-structures/linked-list/skip-linked-list.js +64 -0
- package/dist/cjs/src/data-structures/linked-list/skip-linked-list.js.map +1 -1
- package/dist/cjs/src/data-structures/queue/deque.d.ts +113 -3
- package/dist/cjs/src/data-structures/queue/deque.js +113 -3
- package/dist/cjs/src/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/src/data-structures/queue/queue.d.ts +87 -0
- package/dist/cjs/src/data-structures/queue/queue.js +87 -0
- package/dist/cjs/src/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/src/data-structures/stack/stack.d.ts +42 -0
- package/dist/cjs/src/data-structures/stack/stack.js +42 -0
- package/dist/cjs/src/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/src/data-structures/trie/trie.d.ts +76 -0
- package/dist/cjs/src/data-structures/trie/trie.js +76 -1
- package/dist/cjs/src/data-structures/trie/trie.js.map +1 -1
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.d.ts +88 -23
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.js +88 -23
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.d.ts +180 -74
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.js +415 -236
- package/dist/mjs/src/data-structures/binary-tree/bst.d.ts +121 -66
- package/dist/mjs/src/data-structures/binary-tree/bst.js +121 -67
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +72 -5
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +95 -18
- package/dist/mjs/src/data-structures/binary-tree/tree-multimap.d.ts +82 -43
- package/dist/mjs/src/data-structures/binary-tree/tree-multimap.js +82 -43
- package/dist/mjs/src/data-structures/graph/abstract-graph.d.ts +139 -36
- package/dist/mjs/src/data-structures/graph/abstract-graph.js +147 -36
- package/dist/mjs/src/data-structures/graph/directed-graph.d.ts +126 -0
- package/dist/mjs/src/data-structures/graph/directed-graph.js +126 -0
- package/dist/mjs/src/data-structures/graph/undirected-graph.d.ts +63 -0
- package/dist/mjs/src/data-structures/graph/undirected-graph.js +63 -0
- package/dist/mjs/src/data-structures/heap/heap.d.ts +175 -12
- package/dist/mjs/src/data-structures/heap/heap.js +175 -12
- package/dist/mjs/src/data-structures/linked-list/doubly-linked-list.d.ts +203 -0
- package/dist/mjs/src/data-structures/linked-list/doubly-linked-list.js +203 -0
- package/dist/mjs/src/data-structures/linked-list/singly-linked-list.d.ts +182 -0
- package/dist/mjs/src/data-structures/linked-list/singly-linked-list.js +182 -0
- package/dist/mjs/src/data-structures/linked-list/skip-linked-list.d.ts +64 -0
- package/dist/mjs/src/data-structures/linked-list/skip-linked-list.js +64 -0
- package/dist/mjs/src/data-structures/queue/deque.d.ts +113 -3
- package/dist/mjs/src/data-structures/queue/deque.js +113 -3
- package/dist/mjs/src/data-structures/queue/queue.d.ts +87 -0
- package/dist/mjs/src/data-structures/queue/queue.js +87 -0
- package/dist/mjs/src/data-structures/stack/stack.d.ts +42 -0
- package/dist/mjs/src/data-structures/stack/stack.js +42 -0
- package/dist/mjs/src/data-structures/trie/trie.d.ts +76 -0
- package/dist/mjs/src/data-structures/trie/trie.js +76 -1
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +1 -1
- package/src/data-structures/binary-tree/avl-tree.ts +97 -23
- package/src/data-structures/binary-tree/binary-tree.ts +465 -256
- package/src/data-structures/binary-tree/bst.ts +130 -68
- package/src/data-structures/binary-tree/rb-tree.ts +106 -19
- package/src/data-structures/binary-tree/tree-multimap.ts +88 -44
- package/src/data-structures/graph/abstract-graph.ts +133 -7
- package/src/data-structures/graph/directed-graph.ts +145 -1
- package/src/data-structures/graph/undirected-graph.ts +72 -0
- package/src/data-structures/heap/heap.ts +201 -12
- package/src/data-structures/linked-list/doubly-linked-list.ts +232 -0
- package/src/data-structures/linked-list/singly-linked-list.ts +208 -0
- package/src/data-structures/linked-list/skip-linked-list.ts +74 -0
- package/src/data-structures/queue/deque.ts +127 -3
- package/src/data-structures/queue/queue.ts +99 -0
- package/src/data-structures/stack/stack.ts +48 -0
- package/src/data-structures/trie/trie.ts +87 -4
- package/test/integration/index.html +24 -2
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +2 -1
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +73 -5
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +0 -1
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +0 -1
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
const queue = new Queue();
|
|
31
|
-
for (let i = 0; i <
|
|
31
|
+
for (let i = 0; i < 100000; i++) {
|
|
32
32
|
queue.enqueue(i);
|
|
33
33
|
}
|
|
34
34
|
let last = 0;
|
|
35
35
|
const startTime = performance.now();
|
|
36
36
|
|
|
37
|
-
for (let i = 0; i <
|
|
37
|
+
for (let i = 0; i < 100000; i++) {
|
|
38
38
|
last = queue.dequeue();
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -44,6 +44,28 @@
|
|
|
44
44
|
console.error(e);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
try {
|
|
48
|
+
const {BinaryTree} = dataStructureTyped;
|
|
49
|
+
const tree = new BinaryTree();
|
|
50
|
+
tree.add(3);
|
|
51
|
+
tree.add(12);
|
|
52
|
+
tree.addMany([1, 6, 9, 8,5,2,3,4,7])
|
|
53
|
+
tree.add(10);
|
|
54
|
+
console.log(tree.isPerfectlyBalanced());
|
|
55
|
+
tree.print();
|
|
56
|
+
|
|
57
|
+
const node3 = tree.getNode(3);
|
|
58
|
+
if (node3) node3.right = tree.createNode(1);
|
|
59
|
+
console.log(tree.isPerfectlyBalanced());
|
|
60
|
+
tree.print();
|
|
61
|
+
|
|
62
|
+
tree.clear();
|
|
63
|
+
tree.addMany([1, null, 2, null, 3, null, 4, null, 5, null, 6, null]);
|
|
64
|
+
console.log(tree.isPerfectlyBalanced());
|
|
65
|
+
tree.print();
|
|
66
|
+
} catch (e) {
|
|
67
|
+
console.error(e);
|
|
68
|
+
}
|
|
47
69
|
</script>
|
|
48
70
|
|
|
49
71
|
</body>
|
|
@@ -7,6 +7,7 @@ describe('AVL Tree Test', () => {
|
|
|
7
7
|
|
|
8
8
|
for (const i of arr) tree.add(i, i);
|
|
9
9
|
|
|
10
|
+
tree.add(null);
|
|
10
11
|
const node6 = tree.getNode(6);
|
|
11
12
|
|
|
12
13
|
expect(node6 && tree.getHeight(node6)).toBe(3);
|
|
@@ -42,7 +43,7 @@ describe('AVL Tree Test', () => {
|
|
|
42
43
|
expect(bfs[0].key).toBe(8);
|
|
43
44
|
expect(bfs[bfs.length - 1].key).toBe(16);
|
|
44
45
|
|
|
45
|
-
expect(tree.delete(11)[0].deleted?.key).toBe(11);
|
|
46
|
+
expect(tree.delete(tree.getNode(11))[0].deleted?.key).toBe(11);
|
|
46
47
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
47
48
|
expect(node15 && tree.getHeight(node15)).toBe(2);
|
|
48
49
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {BinaryTree, BinaryTreeNode, IterationType} from '../../../../src';
|
|
2
|
+
import {getRandomIntArray} from "../../../utils";
|
|
3
|
+
import {FamilyPosition} from "binary-tree-typed";
|
|
2
4
|
// import {isDebugTest} from '../../../config';
|
|
3
5
|
|
|
4
6
|
// const isDebug = isDebugTest;
|
|
@@ -64,8 +66,25 @@ describe('BinaryTreeNode', () => {
|
|
|
64
66
|
root.right = rightChild;
|
|
65
67
|
|
|
66
68
|
expect(leftChild.familyPosition).toBe('LEFT');
|
|
69
|
+
leftChild.right = new BinaryTreeNode<number>(4);
|
|
67
70
|
expect(rightChild.familyPosition).toBe('RIGHT');
|
|
68
71
|
expect(root.familyPosition).toBe('ROOT');
|
|
72
|
+
expect(leftChild.familyPosition).toBe('ROOT_LEFT');
|
|
73
|
+
rightChild.left = new BinaryTreeNode<number>(5);
|
|
74
|
+
expect(rightChild.familyPosition).toBe('ROOT_RIGHT');
|
|
75
|
+
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should determine only right child family position correctly', () => {
|
|
79
|
+
const root = new BinaryTreeNode<number>(1);
|
|
80
|
+
const rightChild = new BinaryTreeNode<number>(3);
|
|
81
|
+
const isolated = new BinaryTreeNode<number>(2);
|
|
82
|
+
|
|
83
|
+
root.right = rightChild;
|
|
84
|
+
|
|
85
|
+
expect(rightChild.familyPosition).toBe('RIGHT');
|
|
86
|
+
expect(isolated.familyPosition).toBe(FamilyPosition.ISOLATED);
|
|
87
|
+
expect(root.familyPosition).toBe('ROOT');
|
|
69
88
|
});
|
|
70
89
|
});
|
|
71
90
|
|
|
@@ -86,19 +105,43 @@ describe('BinaryTree', () => {
|
|
|
86
105
|
expect(tree.size).toBe(1);
|
|
87
106
|
});
|
|
88
107
|
|
|
89
|
-
it('should delete
|
|
108
|
+
it('should delete nodes', () => {
|
|
109
|
+
expect(tree.getHeight(tree.root, IterationType.ITERATIVE)).toBe(-1)
|
|
110
|
+
expect(tree.getMinHeight()).toBe(-1)
|
|
90
111
|
const node = tree.add(1);
|
|
91
112
|
expect(tree.size).toBe(1);
|
|
92
113
|
|
|
114
|
+
const leftChild = new BinaryTreeNode<number>(2);
|
|
115
|
+
const rightChild = new BinaryTreeNode<number>(3);
|
|
116
|
+
tree.add(leftChild);
|
|
117
|
+
tree.add(rightChild);
|
|
118
|
+
const root = tree.root;
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
expect(leftChild.familyPosition).toBe('LEFT');
|
|
122
|
+
tree.add(null);
|
|
123
|
+
tree.add(new BinaryTreeNode<number>(4));
|
|
124
|
+
expect(rightChild.familyPosition).toBe('RIGHT');
|
|
125
|
+
expect(root?.familyPosition).toBe('ROOT');
|
|
126
|
+
expect(leftChild.familyPosition).toBe('ROOT_LEFT');
|
|
127
|
+
tree.add(new BinaryTreeNode<number>(5));
|
|
128
|
+
expect(rightChild.familyPosition).toBe('ROOT_RIGHT');
|
|
129
|
+
|
|
130
|
+
tree.delete(new BinaryTreeNode<number>(200));
|
|
131
|
+
tree.delete(rightChild)
|
|
132
|
+
|
|
93
133
|
if (node) {
|
|
94
|
-
const result = tree.delete(node
|
|
134
|
+
const result = tree.delete(node);
|
|
95
135
|
expect(result).toHaveLength(1);
|
|
96
|
-
expect(tree.size).toBe(
|
|
136
|
+
expect(tree.size).toBe(3);
|
|
137
|
+
expect(tree.getMinHeight(tree.root, IterationType.RECURSIVE)).toBe(1)
|
|
97
138
|
}
|
|
139
|
+
|
|
98
140
|
});
|
|
99
141
|
|
|
100
142
|
it('should add and find nodes', () => {
|
|
101
143
|
tree.add(1, 1);
|
|
144
|
+
tree.add(undefined);
|
|
102
145
|
tree.add(2, 2);
|
|
103
146
|
tree.add(3, 3);
|
|
104
147
|
|
|
@@ -112,6 +155,24 @@ describe('BinaryTree', () => {
|
|
|
112
155
|
expect(tree.has('3', node => node.value?.toString())).toBe(true);
|
|
113
156
|
});
|
|
114
157
|
|
|
158
|
+
|
|
159
|
+
it('should be a balance tree after malicious manipulation', () => {
|
|
160
|
+
tree.add(3);
|
|
161
|
+
tree.add(12);
|
|
162
|
+
tree.addMany(getRandomIntArray(100, 1, 100))
|
|
163
|
+
tree.add(10);
|
|
164
|
+
|
|
165
|
+
expect(tree.isPerfectlyBalanced()).toBe(true);
|
|
166
|
+
const node3 = tree.getNode(3);
|
|
167
|
+
|
|
168
|
+
if (node3) node3.right = tree.createNode(1);
|
|
169
|
+
expect(tree.isPerfectlyBalanced()).toBe(false);
|
|
170
|
+
|
|
171
|
+
tree.clear();
|
|
172
|
+
tree.addMany([1, null, 2, null, 3, null, 4, null, 5, null, 6, null]);
|
|
173
|
+
expect(tree.isPerfectlyBalanced()).toBe(false);
|
|
174
|
+
});
|
|
175
|
+
|
|
115
176
|
it('should getDepth return correct depth', () => {
|
|
116
177
|
tree.add(1);
|
|
117
178
|
expect(tree.getDepth(1)).toBe(0);
|
|
@@ -172,6 +233,15 @@ describe('BinaryTree', () => {
|
|
|
172
233
|
expect(tree.isSubtreeBST(tree.getNode(4), IterationType.ITERATIVE)).toBe(true);
|
|
173
234
|
});
|
|
174
235
|
|
|
236
|
+
it('should isSubtreeBST', () => {
|
|
237
|
+
tree.addMany([4, 2, 6, 1, 3, 5, 7, 4]);
|
|
238
|
+
|
|
239
|
+
expect(tree.isSubtreeBST(tree.getNode(4), IterationType.RECURSIVE)).toBe(true);
|
|
240
|
+
expect(tree.isSubtreeBST(tree.getNode(4), IterationType.ITERATIVE)).toBe(true);
|
|
241
|
+
expect(tree.getNodes(2, undefined, false, null)).toEqual([])
|
|
242
|
+
expect(tree.getNodes(tree.getNodeByKey(2), undefined, false, tree.root)).toEqual([tree.getNodeByKey(2)])
|
|
243
|
+
});
|
|
244
|
+
|
|
175
245
|
it('should subTreeTraverse', () => {
|
|
176
246
|
tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
177
247
|
expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
|
|
@@ -480,10 +550,8 @@ describe('BinaryTree', () => {
|
|
|
480
550
|
tree.add(7, 'C');
|
|
481
551
|
|
|
482
552
|
tree.iterationType = IterationType.ITERATIVE;
|
|
483
|
-
// @ts-ignore
|
|
484
553
|
expect([...tree]).toEqual([3, 5, 7]);
|
|
485
554
|
tree.iterationType = IterationType.RECURSIVE;
|
|
486
|
-
// @ts-ignore
|
|
487
555
|
expect([...tree]).toEqual([3, 5, 7]);
|
|
488
556
|
tree.iterationType = IterationType.ITERATIVE;
|
|
489
557
|
|