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.
- package/CHANGELOG.md +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +96 -32
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +46 -8
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -28
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +59 -49
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +75 -7
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +110 -9
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/cjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/cjs/data-structures/matrix/matrix2d.js.map +1 -1
- package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +20 -20
- package/dist/cjs/data-structures/queue/deque.js +22 -22
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +3 -3
- package/dist/cjs/data-structures/queue/queue.js +3 -3
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/cjs/types/helpers.d.ts +1 -4
- package/dist/cjs/types/helpers.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +96 -32
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +46 -8
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/mjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -1
- package/dist/mjs/data-structures/graph/abstract-graph.js +1 -1
- package/dist/mjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/mjs/data-structures/graph/map-graph.js +1 -1
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -28
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +59 -49
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +75 -7
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +110 -9
- package/dist/mjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/mjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/mjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/mjs/data-structures/queue/deque.d.ts +20 -20
- package/dist/mjs/data-structures/queue/deque.js +22 -22
- package/dist/mjs/data-structures/queue/queue.d.ts +3 -3
- package/dist/mjs/data-structures/queue/queue.js +3 -3
- package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/mjs/types/helpers.d.ts +1 -4
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +5 -5
- package/src/data-structures/binary-tree/avl-tree.ts +2 -2
- package/src/data-structures/binary-tree/binary-tree.ts +76 -90
- package/src/data-structures/binary-tree/bst.ts +9 -16
- package/src/data-structures/binary-tree/tree-multiset.ts +2 -2
- package/src/data-structures/graph/abstract-graph.ts +1 -1
- package/src/data-structures/graph/map-graph.ts +2 -2
- package/src/data-structures/linked-list/doubly-linked-list.ts +62 -56
- package/src/data-structures/linked-list/singly-linked-list.ts +118 -13
- package/src/data-structures/matrix/matrix2d.ts +1 -3
- package/src/data-structures/matrix/vector2d.ts +0 -2
- package/src/data-structures/queue/deque.ts +22 -22
- package/src/data-structures/queue/queue.ts +3 -3
- package/src/interfaces/binary-tree.ts +2 -2
- package/src/types/data-structures/binary-tree/binary-tree.ts +0 -4
- package/src/types/helpers.ts +1 -7
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +141 -1
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +289 -47
- package/test/unit/data-structures/binary-tree/bst.test.ts +391 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +73 -7
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +241 -186
- package/test/unit/data-structures/graph/directed-graph.test.ts +34 -4
- package/test/unit/data-structures/graph/map-graph.test.ts +82 -1
- package/test/unit/data-structures/graph/undirected-graph.test.ts +82 -0
- package/test/unit/data-structures/hash/coordinate-map.test.ts +20 -0
- package/test/unit/data-structures/hash/coordinate-set.test.ts +25 -0
- package/test/unit/data-structures/hash/hash-table.test.ts +3 -1
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +69 -6
- package/test/unit/data-structures/linked-list/linked-list.test.ts +2 -2
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +59 -12
- package/test/unit/data-structures/matrix/matrix2d.test.ts +207 -0
- package/test/unit/data-structures/matrix/navigator.test.ts +166 -1
- package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
- package/test/unit/data-structures/queue/deque.test.ts +283 -20
- 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
|
|
74
|
+
let tree: BinaryTree;
|
|
75
75
|
|
|
76
76
|
beforeEach(() => {
|
|
77
|
-
|
|
77
|
+
tree = new BinaryTree();
|
|
78
78
|
});
|
|
79
79
|
|
|
80
80
|
afterEach(() => {
|
|
81
|
-
|
|
81
|
+
tree.clear();
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
const node =
|
|
84
|
+
it('should add a node', () => {
|
|
85
|
+
const node = tree.add(1);
|
|
86
86
|
expect(node).not.toBeNull();
|
|
87
|
-
expect(
|
|
87
|
+
expect(tree.size).toBe(1);
|
|
88
88
|
});
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
const node =
|
|
92
|
-
expect(
|
|
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 =
|
|
95
|
+
const result = tree.delete(node, node => node);
|
|
96
96
|
expect(result).toHaveLength(1);
|
|
97
|
-
expect(
|
|
97
|
+
expect(tree.size).toBe(0);
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
expect(
|
|
109
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
expect(
|
|
119
|
-
|
|
120
|
-
expect(
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
126
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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(
|
|
183
|
+
expect(tree.size).toBe(2);
|
|
144
184
|
|
|
145
|
-
|
|
185
|
+
tree.clear();
|
|
146
186
|
|
|
147
|
-
expect(
|
|
148
|
-
expect(
|
|
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
|
});
|