data-structure-typed 1.39.0 → 1.39.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.
Files changed (100) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
  3. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +96 -32
  4. package/dist/cjs/data-structures/binary-tree/binary-tree.js +46 -8
  5. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  6. package/dist/cjs/data-structures/binary-tree/bst.d.ts +6 -6
  7. package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
  8. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  9. package/dist/cjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
  10. package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
  11. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -1
  12. package/dist/cjs/data-structures/graph/abstract-graph.js +1 -1
  13. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  14. package/dist/cjs/data-structures/graph/map-graph.d.ts +1 -1
  15. package/dist/cjs/data-structures/graph/map-graph.js +1 -1
  16. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  17. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -28
  18. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +59 -49
  19. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  20. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +75 -7
  21. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +110 -9
  22. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  23. package/dist/cjs/data-structures/matrix/matrix2d.d.ts +1 -2
  24. package/dist/cjs/data-structures/matrix/matrix2d.js +3 -7
  25. package/dist/cjs/data-structures/matrix/matrix2d.js.map +1 -1
  26. package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -1
  27. package/dist/cjs/data-structures/matrix/vector2d.js +0 -1
  28. package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
  29. package/dist/cjs/data-structures/queue/deque.d.ts +20 -20
  30. package/dist/cjs/data-structures/queue/deque.js +22 -22
  31. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  32. package/dist/cjs/data-structures/queue/queue.d.ts +3 -3
  33. package/dist/cjs/data-structures/queue/queue.js +3 -3
  34. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  35. package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
  36. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
  37. package/dist/cjs/types/helpers.d.ts +1 -4
  38. package/dist/cjs/types/helpers.js.map +1 -1
  39. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
  40. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +96 -32
  41. package/dist/mjs/data-structures/binary-tree/binary-tree.js +46 -8
  42. package/dist/mjs/data-structures/binary-tree/bst.d.ts +6 -6
  43. package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
  44. package/dist/mjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
  45. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -1
  46. package/dist/mjs/data-structures/graph/abstract-graph.js +1 -1
  47. package/dist/mjs/data-structures/graph/map-graph.d.ts +1 -1
  48. package/dist/mjs/data-structures/graph/map-graph.js +1 -1
  49. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -28
  50. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +59 -49
  51. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +75 -7
  52. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +110 -9
  53. package/dist/mjs/data-structures/matrix/matrix2d.d.ts +1 -2
  54. package/dist/mjs/data-structures/matrix/matrix2d.js +3 -7
  55. package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -1
  56. package/dist/mjs/data-structures/matrix/vector2d.js +0 -1
  57. package/dist/mjs/data-structures/queue/deque.d.ts +20 -20
  58. package/dist/mjs/data-structures/queue/deque.js +22 -22
  59. package/dist/mjs/data-structures/queue/queue.d.ts +3 -3
  60. package/dist/mjs/data-structures/queue/queue.js +3 -3
  61. package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
  62. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
  63. package/dist/mjs/types/helpers.d.ts +1 -4
  64. package/dist/umd/data-structure-typed.min.js +1 -1
  65. package/dist/umd/data-structure-typed.min.js.map +1 -1
  66. package/package.json +5 -5
  67. package/src/data-structures/binary-tree/avl-tree.ts +2 -2
  68. package/src/data-structures/binary-tree/binary-tree.ts +76 -90
  69. package/src/data-structures/binary-tree/bst.ts +9 -16
  70. package/src/data-structures/binary-tree/tree-multiset.ts +2 -2
  71. package/src/data-structures/graph/abstract-graph.ts +1 -1
  72. package/src/data-structures/graph/map-graph.ts +2 -2
  73. package/src/data-structures/linked-list/doubly-linked-list.ts +62 -56
  74. package/src/data-structures/linked-list/singly-linked-list.ts +118 -13
  75. package/src/data-structures/matrix/matrix2d.ts +1 -3
  76. package/src/data-structures/matrix/vector2d.ts +0 -2
  77. package/src/data-structures/queue/deque.ts +22 -22
  78. package/src/data-structures/queue/queue.ts +3 -3
  79. package/src/interfaces/binary-tree.ts +2 -2
  80. package/src/types/data-structures/binary-tree/binary-tree.ts +0 -4
  81. package/src/types/helpers.ts +1 -7
  82. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +141 -1
  83. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +289 -47
  84. package/test/unit/data-structures/binary-tree/bst.test.ts +391 -1
  85. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +73 -7
  86. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +241 -186
  87. package/test/unit/data-structures/graph/directed-graph.test.ts +34 -4
  88. package/test/unit/data-structures/graph/map-graph.test.ts +82 -1
  89. package/test/unit/data-structures/graph/undirected-graph.test.ts +82 -0
  90. package/test/unit/data-structures/hash/coordinate-map.test.ts +20 -0
  91. package/test/unit/data-structures/hash/coordinate-set.test.ts +25 -0
  92. package/test/unit/data-structures/hash/hash-table.test.ts +3 -1
  93. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +69 -6
  94. package/test/unit/data-structures/linked-list/linked-list.test.ts +2 -2
  95. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +59 -12
  96. package/test/unit/data-structures/matrix/matrix2d.test.ts +207 -0
  97. package/test/unit/data-structures/matrix/navigator.test.ts +166 -1
  98. package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
  99. package/test/unit/data-structures/queue/deque.test.ts +283 -20
  100. package/test/unit/data-structures/queue/queue.test.ts +10 -8
@@ -1,4 +1,4 @@
1
- import {AVLTree, AVLTreeNode, CP} from '../../../../src';
1
+ import {AVLTree, AVLTreeNode, CP, IterationType} from '../../../../src';
2
2
 
3
3
  describe('AVL Tree Test', () => {
4
4
  it('should perform various operations on a AVL Tree', () => {
@@ -109,6 +109,115 @@ describe('AVL Tree Test', () => {
109
109
  });
110
110
  });
111
111
 
112
+ describe('AVL Tree Test recursively', () => {
113
+ it('should perform various operations on a AVL Tree', () => {
114
+ const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
115
+ const tree = new AVLTree<number>({iterationType: IterationType.RECURSIVE});
116
+
117
+ for (const i of arr) tree.add(i, i);
118
+
119
+ const node6 = tree.get(6);
120
+
121
+ expect(node6 && tree.getHeight(node6)).toBe(3);
122
+ expect(node6 && tree.getDepth(node6)).toBe(1);
123
+
124
+ const getNodeById = tree.get(10);
125
+ expect(getNodeById?.key).toBe(10);
126
+
127
+ const getMinNodeByRoot = tree.getLeftMost();
128
+ expect(getMinNodeByRoot?.key).toBe(1);
129
+
130
+ const node15 = tree.get(15);
131
+ const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
132
+ expect(getMinNodeBySpecificNode?.key).toBe(12);
133
+
134
+ let subTreeSum = 0;
135
+ node15 && tree.subTreeTraverse(node => (subTreeSum += node.key), node15);
136
+ expect(subTreeSum).toBe(70);
137
+
138
+ let lesserSum = 0;
139
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
140
+ expect(lesserSum).toBe(45);
141
+
142
+ // 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.
143
+ expect(node15?.val).toBe(15);
144
+
145
+ const dfs = tree.dfs(node => node, 'in');
146
+ expect(dfs[0].key).toBe(1);
147
+ expect(dfs[dfs.length - 1].key).toBe(16);
148
+
149
+ tree.perfectlyBalance();
150
+ const bfs = tree.bfs(node => node);
151
+ expect(tree.isPerfectlyBalanced()).toBe(true);
152
+ expect(bfs[0].key).toBe(8);
153
+ expect(bfs[bfs.length - 1].key).toBe(16);
154
+
155
+ expect(tree.delete(11)[0].deleted?.key).toBe(11);
156
+ expect(tree.isAVLBalanced()).toBe(true);
157
+ expect(node15 && tree.getHeight(node15)).toBe(2);
158
+
159
+ expect(tree.delete(1)[0].deleted?.key).toBe(1);
160
+ expect(tree.isAVLBalanced()).toBe(true);
161
+ expect(tree.getHeight()).toBe(4);
162
+
163
+ expect(tree.delete(4)[0].deleted?.key).toBe(4);
164
+ expect(tree.isAVLBalanced()).toBe(true);
165
+ expect(tree.getHeight()).toBe(4);
166
+
167
+ expect(tree.delete(10)[0].deleted?.key).toBe(10);
168
+ expect(tree.isAVLBalanced()).toBe(true);
169
+ expect(tree.getHeight()).toBe(3);
170
+
171
+ expect(tree.delete(15)[0].deleted?.key).toBe(15);
172
+ expect(tree.isAVLBalanced()).toBe(true);
173
+
174
+ expect(tree.getHeight()).toBe(3);
175
+
176
+ expect(tree.delete(5)[0].deleted?.key).toBe(5);
177
+ expect(tree.isAVLBalanced()).toBe(true);
178
+ expect(tree.getHeight()).toBe(3);
179
+
180
+ expect(tree.delete(13)[0].deleted?.key).toBe(13);
181
+ expect(tree.isAVLBalanced()).toBe(true);
182
+ expect(tree.getHeight()).toBe(3);
183
+
184
+ expect(tree.delete(3)[0].deleted?.key).toBe(3);
185
+ expect(tree.isAVLBalanced()).toBe(true);
186
+ expect(tree.getHeight()).toBe(3);
187
+
188
+ expect(tree.delete(8)[0].deleted?.key).toBe(8);
189
+ expect(tree.isAVLBalanced()).toBe(true);
190
+ expect(tree.getHeight()).toBe(3);
191
+
192
+ expect(tree.delete(6)[0].deleted?.key).toBe(6);
193
+ expect(tree.delete(6).length).toBe(0);
194
+ expect(tree.isAVLBalanced()).toBe(true);
195
+ expect(tree.getHeight()).toBe(2);
196
+
197
+ expect(tree.delete(7)[0].deleted?.key).toBe(7);
198
+ expect(tree.isAVLBalanced()).toBe(true);
199
+ expect(tree.getHeight()).toBe(2);
200
+
201
+ expect(tree.delete(9)[0].deleted?.key).toBe(9);
202
+ expect(tree.isAVLBalanced()).toBe(true);
203
+ expect(tree.getHeight()).toBe(2);
204
+ expect(tree.delete(14)[0].deleted?.key).toBe(14);
205
+ expect(tree.isAVLBalanced()).toBe(true);
206
+ expect(tree.getHeight()).toBe(1);
207
+
208
+ expect(tree.isAVLBalanced()).toBe(true);
209
+ const lastBFSIds = tree.bfs();
210
+ expect(lastBFSIds[0]).toBe(12);
211
+ expect(lastBFSIds[1]).toBe(2);
212
+ expect(lastBFSIds[2]).toBe(16);
213
+
214
+ const lastBFSNodes = tree.bfs(node => node);
215
+ expect(lastBFSNodes[0].key).toBe(12);
216
+ expect(lastBFSNodes[1].key).toBe(2);
217
+ expect(lastBFSNodes[2].key).toBe(16);
218
+ });
219
+ });
220
+
112
221
  describe('AVLTree APIs test', () => {
113
222
  const avl = new AVLTree<{ id: number; text: string }>();
114
223
  beforeEach(() => {
@@ -127,3 +236,34 @@ describe('AVLTree APIs test', () => {
127
236
  expect(bfsRes[0]).toBe(2);
128
237
  });
129
238
  });
239
+
240
+ describe('AVLTree', () => {
241
+ it('should balance the tree using _balanceLR when nodes are added', () => {
242
+ const avlTree = new AVLTree();
243
+ avlTree.add(10, 'A');
244
+ avlTree.add(5, 'B');
245
+ avlTree.add(15, 'C');
246
+ avlTree.add(3, 'D');
247
+ avlTree.add(7, 'E');
248
+
249
+ // Adding nodes to trigger _balanceLR
250
+ avlTree.add(12, 'F');
251
+
252
+ // You can add more specific assertions to check the tree's balance and structure.
253
+ });
254
+
255
+ it('should balance the tree using _balanceLR when nodes are deleted', () => {
256
+ const avlTree = new AVLTree();
257
+ avlTree.add(10, 'A');
258
+ avlTree.add(5, 'B');
259
+ avlTree.add(15, 'C');
260
+ avlTree.add(3, 'D');
261
+ avlTree.add(7, 'E');
262
+ avlTree.add(12, 'F');
263
+
264
+ // Deleting nodes to trigger _balanceLR
265
+ avlTree.delete(3);
266
+
267
+ // You can add more specific assertions to check the tree's balance and structure.
268
+ });
269
+ });
@@ -71,81 +71,121 @@ describe('BinaryTreeNode', () => {
71
71
  });
72
72
 
73
73
  describe('BinaryTree', () => {
74
- let binaryTree: BinaryTree;
74
+ let tree: BinaryTree;
75
75
 
76
76
  beforeEach(() => {
77
- binaryTree = new BinaryTree();
77
+ tree = new BinaryTree();
78
78
  });
79
79
 
80
80
  afterEach(() => {
81
- binaryTree.clear();
81
+ tree.clear();
82
82
  });
83
83
 
84
- test('should add a node', () => {
85
- const node = binaryTree.add(1);
84
+ it('should add a node', () => {
85
+ const node = tree.add(1);
86
86
  expect(node).not.toBeNull();
87
- expect(binaryTree.size).toBe(1);
87
+ expect(tree.size).toBe(1);
88
88
  });
89
89
 
90
- test('should delete a node', () => {
91
- const node = binaryTree.add(1);
92
- expect(binaryTree.size).toBe(1);
90
+ it('should delete a node', () => {
91
+ const node = tree.add(1);
92
+ expect(tree.size).toBe(1);
93
93
 
94
94
  if (node) {
95
- const result = binaryTree.delete(node);
95
+ const result = tree.delete(node, node => node);
96
96
  expect(result).toHaveLength(1);
97
- expect(binaryTree.size).toBe(0);
97
+ expect(tree.size).toBe(0);
98
98
  }
99
99
  });
100
100
 
101
- test('should add and find nodes', () => {
102
- binaryTree.add(1);
103
- binaryTree.add(2);
104
- binaryTree.add(3);
101
+ it('should add and find nodes', () => {
102
+ tree.add(1);
103
+ tree.add(2);
104
+ tree.add(3);
105
+
106
+ expect(tree.has(1)).toBe(true);
107
+ expect(tree.has(2)).toBe(true);
108
+ expect(tree.has(3)).toBe(true);
109
+ expect(tree.has(4)).toBe(false);
110
+ const node4 = tree.get(4);
111
+ expect(tree.has(node4, node => node)).toBe(false);
112
+ });
105
113
 
106
- expect(binaryTree.has(1)).toBe(true);
107
- expect(binaryTree.has(2)).toBe(true);
108
- expect(binaryTree.has(3)).toBe(true);
109
- expect(binaryTree.has(4)).toBe(false);
114
+ it('should getDepth return correct depth', () => {
115
+ tree.add(1);
116
+ expect(tree.getDepth(1)).toBe(0);
117
+ tree.add(2);
118
+ expect(tree.getDepth(2)).toBe(1);
119
+ tree.add(3);
120
+ expect(tree.getDepth(3, 1)).toBe(1);
121
+ tree.add(4);
122
+ expect(tree.getDepth(4, 1)).toBe(2);
123
+ expect(tree.getDepth(4)).toBe(2);
124
+ expect(tree.getDepth(4, 2)).toBe(1);
110
125
  });
111
126
 
112
- test('should getDepth return correct depth', () => {
113
- binaryTree.add(1);
114
- expect(binaryTree.getDepth(1)).toBe(0);
115
- binaryTree.add(2);
116
- expect(binaryTree.getDepth(2)).toBe(1);
117
- binaryTree.add(3);
118
- expect(binaryTree.getDepth(3, 1)).toBe(1);
119
- binaryTree.add(4);
120
- expect(binaryTree.getDepth(4, 1)).toBe(2);
121
- expect(binaryTree.getDepth(4)).toBe(2);
122
- expect(binaryTree.getDepth(4, 2)).toBe(1);
127
+ it('should traverse in-order', () => {
128
+ tree.add(null);
129
+ tree.delete(1);
130
+ expect(tree.getHeight()).toBe(-1);
131
+ tree.add(4);
132
+ tree.add(2);
133
+ expect(tree.getHeight()).toBe(1);
134
+ tree.iterationType = IterationType.RECURSIVE;
135
+ expect(tree.getHeight()).toBe(1);
136
+ tree.iterationType = IterationType.ITERATIVE;
137
+
138
+ tree.add(6);
139
+ tree.add(1);
140
+ tree.add(new BinaryTreeNode(3));
141
+ tree.add(5);
142
+ tree.add(7);
143
+
144
+ const inOrder = tree.dfs(node => node.key);
145
+
146
+ expect(inOrder).toEqual([1, 2, 3, 4, 5, 6, 7]);
123
147
  });
124
148
 
125
- test('should traverse in-order', () => {
126
- binaryTree.add(4);
127
- binaryTree.add(2);
128
- binaryTree.add(6);
129
- binaryTree.add(1);
130
- binaryTree.add(3);
131
- binaryTree.add(5);
132
- binaryTree.add(7);
149
+ it('should getLeftMost', () => {
150
+ tree.addMany([4, 2, 6, 1, 3, 5, 7]);
133
151
 
134
- const inOrder = binaryTree.dfs(node => node.key);
152
+ const leftMost = tree.getLeftMost(tree.root, IterationType.RECURSIVE);
153
+ expect(leftMost?.key).toEqual(1);
154
+ const rightMost = tree.getRightMost(tree.root, IterationType.RECURSIVE);
155
+ expect(rightMost?.key).toEqual(7);
156
+ });
135
157
 
136
- expect(inOrder).toEqual([1, 2, 3, 4, 5, 6, 7]);
158
+ it('should isSubtreeBST', () => {
159
+ tree.addMany([
160
+ new BinaryTreeNode(4, 4),
161
+ new BinaryTreeNode(2, 2),
162
+ new BinaryTreeNode(6, 6),
163
+ new BinaryTreeNode(1, 1),
164
+ new BinaryTreeNode(3, 3),
165
+ new BinaryTreeNode(5, 5),
166
+ new BinaryTreeNode(7, 7),
167
+ new BinaryTreeNode(4, 4)
168
+ ]);
169
+
170
+ expect(tree.isSubtreeBST(tree.get(4), IterationType.RECURSIVE)).toBe(true);
171
+ expect(tree.isSubtreeBST(tree.get(4), IterationType.ITERATIVE)).toBe(true);
137
172
  });
138
173
 
139
- test('should clear the tree', () => {
140
- binaryTree.add(1);
141
- binaryTree.add(2);
174
+ it('should subTreeTraverse', () => {
175
+ tree.addMany([4, 2, 6, 1, 3, 5, 7]);
176
+ expect(tree.subTreeTraverse(node => node.key, tree.get(6), IterationType.RECURSIVE)).toEqual([6, 5, 7]);
177
+ });
178
+
179
+ it('should clear the tree', () => {
180
+ tree.add(1);
181
+ tree.add(2);
142
182
 
143
- expect(binaryTree.size).toBe(2);
183
+ expect(tree.size).toBe(2);
144
184
 
145
- binaryTree.clear();
185
+ tree.clear();
146
186
 
147
- expect(binaryTree.size).toBe(0);
148
- expect(binaryTree.root).toBeNull();
187
+ expect(tree.size).toBe(0);
188
+ expect(tree.root).toBeNull();
149
189
  });
150
190
  });
151
191
 
@@ -166,6 +206,7 @@ describe('BinaryTree Morris Traversal', () => {
166
206
 
167
207
  expect(result).toEqual(expected);
168
208
  expect(tree.dfs(node => node.key, 'in')).toEqual(expected);
209
+ expect(tree.dfs(node => node.key, 'in', tree.root, IterationType.RECURSIVE)).toEqual(expected);
169
210
  });
170
211
 
171
212
  it('should perform pre-order Morris traversal correctly as dfs traversal', () => {
@@ -224,8 +265,10 @@ describe('BinaryTree traversals', () => {
224
265
  const arr = [35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55];
225
266
  tree.refill(arr);
226
267
  expect(tree.dfs(node => node.key, 'pre')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
268
+ expect(tree.dfs(node => node.key, 'pre', tree.root, IterationType.RECURSIVE)).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
227
269
  expect(tree.dfs(node => node.key, 'in')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
228
270
  expect(tree.dfs(node => node.key, 'post')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
271
+ expect(tree.dfs(node => node.key, 'post', tree.root, IterationType.RECURSIVE)).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
229
272
  expect(tree.bfs(node => node.key, tree.root, IterationType.RECURSIVE)).toEqual([
230
273
  35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
231
274
  ]);
@@ -236,4 +279,203 @@ describe('BinaryTree traversals', () => {
236
279
  const levels = tree.listLevels(node => node.key);
237
280
  expect(levels).toEqual([[35], [20, 40], [15, 29, 50], [16, 28, 30, 45, 55]]);
238
281
  isDebug && console.log(levels);
282
+
283
+ expect(tree.listLevels(node => node.key, tree.root, IterationType.RECURSIVE)).toEqual([
284
+ [35],
285
+ [20, 40],
286
+ [15, 29, 50],
287
+ [16, 28, 30, 45, 55]
288
+ ]);
289
+ isDebug && console.log(levels);
290
+ });
291
+
292
+ describe('BinaryTree', () => {
293
+ let tree: BinaryTree<string>;
294
+
295
+ beforeEach(() => {
296
+ tree = new BinaryTree<string>({iterationType: IterationType.RECURSIVE});
297
+ });
298
+
299
+ afterEach(() => {
300
+ tree.clear();
301
+ });
302
+
303
+ it('should create an empty BinaryTree', () => {
304
+ expect(tree.size).toBe(0);
305
+ expect(tree.isEmpty()).toBe(true);
306
+ expect(tree.root).toBe(null);
307
+ });
308
+
309
+ it('should add nodes to the tree', () => {
310
+ tree.add(5, 'A');
311
+ tree.add(3, 'B');
312
+ tree.add(7, 'C');
313
+
314
+ expect(tree.size).toBe(3);
315
+ expect(tree.isEmpty()).toBe(false);
316
+ expect(tree.root?.key).toBe(5);
317
+ });
318
+
319
+ it('should clear the BinaryTree', () => {
320
+ tree.add(5, 'A');
321
+ tree.add(3, 'B');
322
+ tree.add(7, 'C');
323
+
324
+ tree.clear();
325
+
326
+ expect(tree.size).toBe(0);
327
+ expect(tree.isEmpty()).toBe(true);
328
+ expect(tree.root).toBe(null);
329
+ });
330
+
331
+ it('should get nodes by key', () => {
332
+ tree.add(5, 'A');
333
+ tree.add(3, 'B');
334
+ tree.add(7, 'C');
335
+
336
+ const nodeA = tree.get(5);
337
+ const nodeB = tree.get(3);
338
+
339
+ expect(nodeA?.key).toBe(5);
340
+ expect(nodeA?.val).toBe('A');
341
+ expect(nodeB?.key).toBe(3);
342
+ expect(nodeB?.val).toBe('B');
343
+ });
344
+
345
+ it('should return null when getting a non-existent node', () => {
346
+ tree.add(5, 'A');
347
+
348
+ const node = tree.get(3);
349
+
350
+ expect(node).toBe(null);
351
+ });
352
+
353
+ it('should get the depth of a node', () => {
354
+ tree.add(5, 'A');
355
+ tree.add(3, 'B');
356
+ tree.add(7, 'C');
357
+
358
+ expect(tree.getDepth(7)).toBe(1);
359
+ expect(tree.getDepth(3)).toBe(1);
360
+ });
361
+
362
+ it('should get the height of the tree', () => {
363
+ tree.add(5, 'A');
364
+ tree.add(3, 'B');
365
+ tree.add(7, 'C');
366
+
367
+ expect(tree.getHeight()).toBe(1);
368
+ expect(tree.getHeight(undefined, IterationType.RECURSIVE)).toBe(1);
369
+ expect(tree.getMinHeight(undefined, IterationType.RECURSIVE)).toBe(1);
370
+ });
371
+
372
+ it('should check if the tree is a binary search tree', () => {
373
+ tree.add(5, 'A');
374
+ tree.add(3, 'B');
375
+ tree.add(7, 'C');
376
+
377
+ expect(tree.isBST()).toBe(true);
378
+ });
379
+
380
+ it('should perform a depth-first traversal', () => {
381
+ tree.add(5, 'A');
382
+ tree.add(3, 'B');
383
+ tree.add(7, 'C');
384
+
385
+ const result = tree.dfs();
386
+ expect(result).toEqual([3, 5, 7]);
387
+ // Add assertions for the result of depth-first traversal
388
+ });
389
+
390
+ it('should perform a breadth-first traversal', () => {
391
+ tree.add(5, 'A');
392
+ tree.add(3, 'B');
393
+ tree.add(7, 'C');
394
+
395
+ const result = tree.bfs(node => node.key);
396
+ expect(result).toEqual([5, 3, 7]);
397
+ // Add assertions for the result of breadth-first traversal
398
+ });
399
+
400
+ it('should list levels of the tree', () => {
401
+ tree.add(5, 'A');
402
+ tree.add(3, 'B');
403
+ tree.add(7, 'C');
404
+
405
+ const levels = tree.listLevels();
406
+ expect(levels).toEqual([[5], [3, 7]]);
407
+ // Add assertions for the levels of the tree
408
+ });
409
+
410
+ it('should delete nodes from the tree', () => {
411
+ tree.add(5, 'A');
412
+ tree.add(3, 'B');
413
+ tree.add(7, 'C');
414
+
415
+ tree.delete(3);
416
+
417
+ expect(tree.size).toBe(2);
418
+ expect(tree.get(3)).toBe(null);
419
+ });
420
+
421
+ it('should check if the tree is perfectly balanced', () => {
422
+ tree.add(5, 'A');
423
+ tree.add(3, 'B');
424
+ tree.add(7, 'C');
425
+
426
+ expect(tree.isPerfectlyBalanced()).toBe(true);
427
+ });
428
+
429
+ it('should get nodes by a custom callback', () => {
430
+ tree.add(5, 'A');
431
+ tree.add(3, 'B');
432
+ tree.add(7, 'C');
433
+
434
+ const nodes = tree.getNodes('B', (node: BinaryTreeNode<string>) => node.val);
435
+
436
+ expect(nodes.length).toBe(1);
437
+ expect(nodes[0].key).toBe(3);
438
+
439
+ const nodesRec = tree.getNodes(
440
+ 'B',
441
+ (node: BinaryTreeNode<string>) => node.val,
442
+ false,
443
+ tree.root,
444
+ IterationType.RECURSIVE
445
+ );
446
+
447
+ expect(nodesRec.length).toBe(1);
448
+ expect(nodesRec[0].key).toBe(3);
449
+ });
450
+
451
+ it('should perform Morris traversal', () => {
452
+ tree.add(5, 'A');
453
+ tree.add(3, 'B');
454
+ tree.add(7, 'C');
455
+
456
+ tree.iterationType = IterationType.ITERATIVE;
457
+ // @ts-ignore
458
+ expect([...tree]).toEqual([3, 5, 7]);
459
+ tree.iterationType = IterationType.RECURSIVE;
460
+ // @ts-ignore
461
+ expect([...tree]).toEqual([3, 5, 7]);
462
+ tree.iterationType = IterationType.ITERATIVE;
463
+
464
+ const result = tree.morris();
465
+ expect(result).toEqual([3, 5, 7]);
466
+ // Add assertions for the result of Morris traversal
467
+ });
468
+
469
+ it('should perform delete all', () => {
470
+ tree.add(5, 'A');
471
+ tree.add(3, 'B');
472
+ tree.add(7, 'C');
473
+
474
+ tree.delete(5);
475
+ tree.delete(7);
476
+ tree.delete(3);
477
+
478
+ expect(tree.root).toBe(null);
479
+ expect(tree.getHeight()).toBe(-1);
480
+ });
239
481
  });