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.
Files changed (108) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +18 -18
  3. package/benchmark/report.html +12 -12
  4. package/benchmark/report.json +106 -106
  5. package/dist/cjs/src/data-structures/binary-tree/avl-tree.d.ts +88 -23
  6. package/dist/cjs/src/data-structures/binary-tree/avl-tree.js +88 -23
  7. package/dist/cjs/src/data-structures/binary-tree/avl-tree.js.map +1 -1
  8. package/dist/cjs/src/data-structures/binary-tree/binary-tree.d.ts +180 -74
  9. package/dist/cjs/src/data-structures/binary-tree/binary-tree.js +415 -236
  10. package/dist/cjs/src/data-structures/binary-tree/binary-tree.js.map +1 -1
  11. package/dist/cjs/src/data-structures/binary-tree/bst.d.ts +121 -66
  12. package/dist/cjs/src/data-structures/binary-tree/bst.js +121 -67
  13. package/dist/cjs/src/data-structures/binary-tree/bst.js.map +1 -1
  14. package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +72 -5
  15. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +95 -18
  16. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
  17. package/dist/cjs/src/data-structures/binary-tree/tree-multimap.d.ts +82 -43
  18. package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js +82 -43
  19. package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js.map +1 -1
  20. package/dist/cjs/src/data-structures/graph/abstract-graph.d.ts +139 -36
  21. package/dist/cjs/src/data-structures/graph/abstract-graph.js +147 -36
  22. package/dist/cjs/src/data-structures/graph/abstract-graph.js.map +1 -1
  23. package/dist/cjs/src/data-structures/graph/directed-graph.d.ts +126 -0
  24. package/dist/cjs/src/data-structures/graph/directed-graph.js +126 -0
  25. package/dist/cjs/src/data-structures/graph/directed-graph.js.map +1 -1
  26. package/dist/cjs/src/data-structures/graph/undirected-graph.d.ts +63 -0
  27. package/dist/cjs/src/data-structures/graph/undirected-graph.js +63 -0
  28. package/dist/cjs/src/data-structures/graph/undirected-graph.js.map +1 -1
  29. package/dist/cjs/src/data-structures/heap/heap.d.ts +175 -12
  30. package/dist/cjs/src/data-structures/heap/heap.js +175 -12
  31. package/dist/cjs/src/data-structures/heap/heap.js.map +1 -1
  32. package/dist/cjs/src/data-structures/linked-list/doubly-linked-list.d.ts +203 -0
  33. package/dist/cjs/src/data-structures/linked-list/doubly-linked-list.js +203 -0
  34. package/dist/cjs/src/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  35. package/dist/cjs/src/data-structures/linked-list/singly-linked-list.d.ts +182 -0
  36. package/dist/cjs/src/data-structures/linked-list/singly-linked-list.js +182 -0
  37. package/dist/cjs/src/data-structures/linked-list/singly-linked-list.js.map +1 -1
  38. package/dist/cjs/src/data-structures/linked-list/skip-linked-list.d.ts +64 -0
  39. package/dist/cjs/src/data-structures/linked-list/skip-linked-list.js +64 -0
  40. package/dist/cjs/src/data-structures/linked-list/skip-linked-list.js.map +1 -1
  41. package/dist/cjs/src/data-structures/queue/deque.d.ts +113 -3
  42. package/dist/cjs/src/data-structures/queue/deque.js +113 -3
  43. package/dist/cjs/src/data-structures/queue/deque.js.map +1 -1
  44. package/dist/cjs/src/data-structures/queue/queue.d.ts +87 -0
  45. package/dist/cjs/src/data-structures/queue/queue.js +87 -0
  46. package/dist/cjs/src/data-structures/queue/queue.js.map +1 -1
  47. package/dist/cjs/src/data-structures/stack/stack.d.ts +42 -0
  48. package/dist/cjs/src/data-structures/stack/stack.js +42 -0
  49. package/dist/cjs/src/data-structures/stack/stack.js.map +1 -1
  50. package/dist/cjs/src/data-structures/trie/trie.d.ts +76 -0
  51. package/dist/cjs/src/data-structures/trie/trie.js +76 -1
  52. package/dist/cjs/src/data-structures/trie/trie.js.map +1 -1
  53. package/dist/mjs/src/data-structures/binary-tree/avl-tree.d.ts +88 -23
  54. package/dist/mjs/src/data-structures/binary-tree/avl-tree.js +88 -23
  55. package/dist/mjs/src/data-structures/binary-tree/binary-tree.d.ts +180 -74
  56. package/dist/mjs/src/data-structures/binary-tree/binary-tree.js +415 -236
  57. package/dist/mjs/src/data-structures/binary-tree/bst.d.ts +121 -66
  58. package/dist/mjs/src/data-structures/binary-tree/bst.js +121 -67
  59. package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +72 -5
  60. package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +95 -18
  61. package/dist/mjs/src/data-structures/binary-tree/tree-multimap.d.ts +82 -43
  62. package/dist/mjs/src/data-structures/binary-tree/tree-multimap.js +82 -43
  63. package/dist/mjs/src/data-structures/graph/abstract-graph.d.ts +139 -36
  64. package/dist/mjs/src/data-structures/graph/abstract-graph.js +147 -36
  65. package/dist/mjs/src/data-structures/graph/directed-graph.d.ts +126 -0
  66. package/dist/mjs/src/data-structures/graph/directed-graph.js +126 -0
  67. package/dist/mjs/src/data-structures/graph/undirected-graph.d.ts +63 -0
  68. package/dist/mjs/src/data-structures/graph/undirected-graph.js +63 -0
  69. package/dist/mjs/src/data-structures/heap/heap.d.ts +175 -12
  70. package/dist/mjs/src/data-structures/heap/heap.js +175 -12
  71. package/dist/mjs/src/data-structures/linked-list/doubly-linked-list.d.ts +203 -0
  72. package/dist/mjs/src/data-structures/linked-list/doubly-linked-list.js +203 -0
  73. package/dist/mjs/src/data-structures/linked-list/singly-linked-list.d.ts +182 -0
  74. package/dist/mjs/src/data-structures/linked-list/singly-linked-list.js +182 -0
  75. package/dist/mjs/src/data-structures/linked-list/skip-linked-list.d.ts +64 -0
  76. package/dist/mjs/src/data-structures/linked-list/skip-linked-list.js +64 -0
  77. package/dist/mjs/src/data-structures/queue/deque.d.ts +113 -3
  78. package/dist/mjs/src/data-structures/queue/deque.js +113 -3
  79. package/dist/mjs/src/data-structures/queue/queue.d.ts +87 -0
  80. package/dist/mjs/src/data-structures/queue/queue.js +87 -0
  81. package/dist/mjs/src/data-structures/stack/stack.d.ts +42 -0
  82. package/dist/mjs/src/data-structures/stack/stack.js +42 -0
  83. package/dist/mjs/src/data-structures/trie/trie.d.ts +76 -0
  84. package/dist/mjs/src/data-structures/trie/trie.js +76 -1
  85. package/dist/umd/data-structure-typed.min.js +1 -1
  86. package/dist/umd/data-structure-typed.min.js.map +1 -1
  87. package/package.json +1 -1
  88. package/src/data-structures/binary-tree/avl-tree.ts +97 -23
  89. package/src/data-structures/binary-tree/binary-tree.ts +465 -256
  90. package/src/data-structures/binary-tree/bst.ts +130 -68
  91. package/src/data-structures/binary-tree/rb-tree.ts +106 -19
  92. package/src/data-structures/binary-tree/tree-multimap.ts +88 -44
  93. package/src/data-structures/graph/abstract-graph.ts +133 -7
  94. package/src/data-structures/graph/directed-graph.ts +145 -1
  95. package/src/data-structures/graph/undirected-graph.ts +72 -0
  96. package/src/data-structures/heap/heap.ts +201 -12
  97. package/src/data-structures/linked-list/doubly-linked-list.ts +232 -0
  98. package/src/data-structures/linked-list/singly-linked-list.ts +208 -0
  99. package/src/data-structures/linked-list/skip-linked-list.ts +74 -0
  100. package/src/data-structures/queue/deque.ts +127 -3
  101. package/src/data-structures/queue/queue.ts +99 -0
  102. package/src/data-structures/stack/stack.ts +48 -0
  103. package/src/data-structures/trie/trie.ts +87 -4
  104. package/test/integration/index.html +24 -2
  105. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +2 -1
  106. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +73 -5
  107. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +0 -1
  108. 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 < 1000000; 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 < 1000000; 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 a node', () => {
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, node => node);
134
+ const result = tree.delete(node);
95
135
  expect(result).toHaveLength(1);
96
- expect(tree.size).toBe(0);
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
 
@@ -54,7 +54,6 @@ describe('DoublyLinkedList Operation Test', () => {
54
54
  });
55
55
 
56
56
  it('should insertAfter tail', () => {
57
- // @ts-ignore
58
57
  expect([...list]).toEqual([1, 2, 3, 4, 5]);
59
58
  });
60
59
  });
@@ -441,7 +441,6 @@ describe('SinglyLinkedList', () => {
441
441
  list.push(3);
442
442
  const array = list.toArray();
443
443
  expect(array).toEqual([1, 2, 3]);
444
- // @ts-ignore
445
444
  expect([...list]).toEqual([1, 2, 3]);
446
445
  });
447
446