data-structure-typed 1.33.0 → 1.33.5

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 (222) hide show
  1. package/{.eslintrc.json → .eslintrc.js} +2 -1
  2. package/.github/workflows/ci.yml +15 -3
  3. package/.github/workflows/release-package.yml +32 -0
  4. package/{.prettierrc → .prettierrc.js} +1 -1
  5. package/CHANGELOG.md +5 -1
  6. package/README.md +196 -257
  7. package/coverage/coverage-final.json +64 -64
  8. package/coverage/coverage-summary.json +16 -16
  9. package/dist/data-structures/binary-tree/abstract-binary-tree.js +1 -16
  10. package/dist/data-structures/binary-tree/abstract-binary-tree.js.map +1 -1
  11. package/dist/data-structures/binary-tree/avl-tree.js +2 -2
  12. package/dist/data-structures/binary-tree/avl-tree.js.map +1 -1
  13. package/dist/data-structures/binary-tree/rb-tree.js +3 -4
  14. package/dist/data-structures/binary-tree/rb-tree.js.map +1 -1
  15. package/dist/data-structures/graph/abstract-graph.js +12 -12
  16. package/dist/data-structures/graph/abstract-graph.js.map +1 -1
  17. package/dist/data-structures/graph/directed-graph.js.map +1 -1
  18. package/dist/data-structures/graph/undirected-graph.js.map +1 -1
  19. package/dist/data-structures/hash/hash-table.js +107 -2
  20. package/dist/data-structures/hash/hash-table.js.map +1 -1
  21. package/dist/data-structures/heap/max-heap.js.map +1 -1
  22. package/dist/data-structures/heap/min-heap.js.map +1 -1
  23. package/dist/data-structures/linked-list/doubly-linked-list.js +30 -0
  24. package/dist/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  25. package/dist/data-structures/matrix/matrix2d.js +5 -8
  26. package/dist/data-structures/matrix/matrix2d.js.map +1 -1
  27. package/dist/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  28. package/dist/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  29. package/dist/data-structures/priority-queue/priority-queue.js +6 -6
  30. package/dist/data-structures/priority-queue/priority-queue.js.map +1 -1
  31. package/dist/data-structures/queue/deque.js.map +1 -1
  32. package/docs/index.html +196 -256
  33. package/docs/modules.html +2 -0
  34. package/lib/data-structures/binary-tree/abstract-binary-tree.d.ts +8 -18
  35. package/lib/data-structures/binary-tree/abstract-binary-tree.js +5 -23
  36. package/lib/data-structures/binary-tree/avl-tree.d.ts +7 -10
  37. package/lib/data-structures/binary-tree/avl-tree.js +6 -9
  38. package/lib/data-structures/binary-tree/binary-tree.d.ts +2 -2
  39. package/lib/data-structures/binary-tree/bst.d.ts +2 -2
  40. package/lib/data-structures/binary-tree/rb-tree.d.ts +3 -3
  41. package/lib/data-structures/binary-tree/rb-tree.js +3 -3
  42. package/lib/data-structures/binary-tree/tree-multiset.d.ts +3 -3
  43. package/lib/data-structures/binary-tree/tree-multiset.js +1 -1
  44. package/lib/data-structures/graph/abstract-graph.d.ts +10 -10
  45. package/lib/data-structures/graph/abstract-graph.js +2 -2
  46. package/lib/data-structures/graph/directed-graph.d.ts +6 -6
  47. package/lib/data-structures/graph/directed-graph.js +2 -2
  48. package/lib/data-structures/graph/map-graph.d.ts +6 -6
  49. package/lib/data-structures/graph/map-graph.js +2 -2
  50. package/lib/data-structures/graph/undirected-graph.d.ts +6 -6
  51. package/lib/data-structures/graph/undirected-graph.js +2 -2
  52. package/lib/data-structures/hash/hash-table.d.ts +61 -1
  53. package/lib/data-structures/hash/hash-table.js +136 -0
  54. package/lib/data-structures/heap/heap.d.ts +31 -31
  55. package/lib/data-structures/heap/heap.js +11 -11
  56. package/lib/data-structures/heap/max-heap.d.ts +4 -4
  57. package/lib/data-structures/heap/max-heap.js +1 -1
  58. package/lib/data-structures/heap/min-heap.d.ts +4 -4
  59. package/lib/data-structures/heap/min-heap.js +1 -1
  60. package/lib/data-structures/linked-list/doubly-linked-list.d.ts +93 -54
  61. package/lib/data-structures/linked-list/doubly-linked-list.js +79 -22
  62. package/lib/data-structures/linked-list/singly-linked-list.d.ts +46 -46
  63. package/lib/data-structures/linked-list/singly-linked-list.js +20 -20
  64. package/lib/data-structures/matrix/matrix.d.ts +3 -3
  65. package/lib/data-structures/matrix/matrix2d.d.ts +1 -1
  66. package/lib/data-structures/matrix/matrix2d.js +3 -2
  67. package/lib/data-structures/priority-queue/max-priority-queue.d.ts +4 -4
  68. package/lib/data-structures/priority-queue/min-priority-queue.d.ts +4 -4
  69. package/lib/data-structures/priority-queue/priority-queue.d.ts +26 -26
  70. package/lib/data-structures/priority-queue/priority-queue.js +8 -8
  71. package/lib/data-structures/queue/deque.d.ts +30 -30
  72. package/lib/data-structures/queue/deque.js +7 -7
  73. package/lib/data-structures/queue/queue.d.ts +27 -27
  74. package/lib/data-structures/queue/queue.js +8 -8
  75. package/lib/data-structures/stack/stack.d.ts +15 -15
  76. package/lib/data-structures/stack/stack.js +6 -6
  77. package/lib/data-structures/tree/tree.d.ts +7 -7
  78. package/lib/interfaces/abstract-binary-tree.d.ts +0 -1
  79. package/lib/interfaces/avl-tree.d.ts +1 -1
  80. package/lib/types/data-structures/navigator.d.ts +1 -1
  81. package/package.json +68 -62
  82. package/src/data-structures/binary-tree/aa-tree.ts +1 -0
  83. package/src/data-structures/binary-tree/abstract-binary-tree.ts +1608 -0
  84. package/src/data-structures/binary-tree/avl-tree.ts +307 -0
  85. package/src/data-structures/binary-tree/b-tree.ts +1 -0
  86. package/src/data-structures/binary-tree/binary-indexed-tree.ts +76 -0
  87. package/src/data-structures/binary-tree/binary-tree.ts +47 -0
  88. package/src/data-structures/binary-tree/bst.ts +537 -0
  89. package/src/data-structures/binary-tree/index.ts +12 -0
  90. package/src/data-structures/binary-tree/rb-tree.ts +366 -0
  91. package/src/data-structures/binary-tree/segment-tree.ts +242 -0
  92. package/src/data-structures/binary-tree/splay-tree.ts +1 -0
  93. package/src/data-structures/binary-tree/tree-multiset.ts +700 -0
  94. package/src/data-structures/binary-tree/two-three-tree.ts +1 -0
  95. package/src/data-structures/graph/abstract-graph.ts +1040 -0
  96. package/src/data-structures/graph/directed-graph.ts +470 -0
  97. package/src/data-structures/graph/index.ts +4 -0
  98. package/src/data-structures/graph/map-graph.ts +129 -0
  99. package/src/data-structures/graph/undirected-graph.ts +274 -0
  100. package/src/data-structures/hash/coordinate-map.ts +67 -0
  101. package/src/data-structures/hash/coordinate-set.ts +56 -0
  102. package/src/data-structures/hash/hash-table.ts +157 -0
  103. package/src/data-structures/hash/index.ts +6 -0
  104. package/src/data-structures/hash/pair.ts +1 -0
  105. package/src/data-structures/hash/tree-map.ts +1 -0
  106. package/src/data-structures/hash/tree-set.ts +1 -0
  107. package/src/data-structures/heap/heap.ts +212 -0
  108. package/src/data-structures/heap/index.ts +3 -0
  109. package/src/data-structures/heap/max-heap.ts +31 -0
  110. package/src/data-structures/heap/min-heap.ts +32 -0
  111. package/src/data-structures/index.ts +11 -0
  112. package/src/data-structures/linked-list/doubly-linked-list.ts +636 -0
  113. package/src/data-structures/linked-list/index.ts +3 -0
  114. package/src/data-structures/linked-list/singly-linked-list.ts +501 -0
  115. package/src/data-structures/linked-list/skip-linked-list.ts +1 -0
  116. package/src/data-structures/matrix/index.ts +4 -0
  117. package/src/data-structures/matrix/matrix.ts +27 -0
  118. package/src/data-structures/matrix/matrix2d.ts +213 -0
  119. package/src/data-structures/matrix/navigator.ts +121 -0
  120. package/src/data-structures/matrix/vector2d.ts +316 -0
  121. package/src/data-structures/priority-queue/index.ts +3 -0
  122. package/src/data-structures/priority-queue/max-priority-queue.ts +56 -0
  123. package/src/data-structures/priority-queue/min-priority-queue.ts +57 -0
  124. package/src/data-structures/priority-queue/priority-queue.ts +359 -0
  125. package/src/data-structures/queue/deque.ts +297 -0
  126. package/src/data-structures/queue/index.ts +2 -0
  127. package/src/data-structures/queue/queue.ts +191 -0
  128. package/src/data-structures/stack/index.ts +1 -0
  129. package/src/data-structures/stack/stack.ts +98 -0
  130. package/src/data-structures/tree/index.ts +1 -0
  131. package/src/data-structures/tree/tree.ts +69 -0
  132. package/src/data-structures/trie/index.ts +1 -0
  133. package/src/data-structures/trie/trie.ts +225 -0
  134. package/src/index.ts +4 -0
  135. package/src/interfaces/abstract-binary-tree.ts +189 -0
  136. package/src/interfaces/abstract-graph.ts +31 -0
  137. package/src/interfaces/avl-tree.ts +25 -0
  138. package/src/interfaces/binary-tree.ts +6 -0
  139. package/src/interfaces/bst.ts +31 -0
  140. package/src/interfaces/directed-graph.ts +20 -0
  141. package/src/interfaces/doubly-linked-list.ts +1 -0
  142. package/src/interfaces/heap.ts +1 -0
  143. package/src/interfaces/index.ts +15 -0
  144. package/src/interfaces/navigator.ts +1 -0
  145. package/src/interfaces/priority-queue.ts +1 -0
  146. package/src/interfaces/rb-tree.ts +9 -0
  147. package/src/interfaces/segment-tree.ts +1 -0
  148. package/src/interfaces/singly-linked-list.ts +1 -0
  149. package/src/interfaces/tree-multiset.ts +7 -0
  150. package/src/interfaces/undirected-graph.ts +6 -0
  151. package/src/types/data-structures/abstract-binary-tree.ts +50 -0
  152. package/src/types/data-structures/abstract-graph.ts +11 -0
  153. package/src/types/data-structures/avl-tree.ts +5 -0
  154. package/src/types/data-structures/binary-tree.ts +5 -0
  155. package/src/types/data-structures/bst.ts +13 -0
  156. package/src/types/data-structures/directed-graph.ts +8 -0
  157. package/src/types/data-structures/doubly-linked-list.ts +1 -0
  158. package/src/types/data-structures/heap.ts +5 -0
  159. package/src/types/data-structures/index.ts +15 -0
  160. package/src/types/data-structures/map-graph.ts +1 -0
  161. package/src/types/data-structures/navigator.ts +13 -0
  162. package/src/types/data-structures/priority-queue.ts +9 -0
  163. package/src/types/data-structures/rb-tree.ts +8 -0
  164. package/src/types/data-structures/segment-tree.ts +1 -0
  165. package/src/types/data-structures/singly-linked-list.ts +1 -0
  166. package/src/types/data-structures/tree-multiset.ts +6 -0
  167. package/src/types/helpers.ts +1 -0
  168. package/src/types/index.ts +3 -0
  169. package/src/types/utils/index.ts +2 -0
  170. package/src/types/utils/utils.ts +6 -0
  171. package/src/types/utils/validate-type.ts +35 -0
  172. package/src/utils/index.ts +1 -0
  173. package/src/utils/utils.ts +79 -0
  174. package/test/integration/avl-tree.test.ts +14 -17
  175. package/test/integration/bst.test.ts +50 -41
  176. package/test/integration/heap.test.js +0 -3
  177. package/test/integration/index.html +6 -6
  178. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +14 -17
  179. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +142 -0
  180. package/test/unit/data-structures/binary-tree/bst.test.ts +50 -41
  181. package/test/unit/data-structures/binary-tree/overall.test.ts +36 -28
  182. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +43 -0
  183. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +23 -12
  184. package/test/unit/data-structures/graph/directed-graph.test.ts +27 -25
  185. package/test/unit/data-structures/graph/map-graph.test.ts +4 -5
  186. package/test/unit/data-structures/graph/overall.test.ts +10 -11
  187. package/test/unit/data-structures/graph/undirected-graph.test.ts +0 -1
  188. package/test/unit/data-structures/hash/coordinate-map.test.ts +54 -0
  189. package/test/unit/data-structures/hash/coordinate-set.test.ts +41 -0
  190. package/test/unit/data-structures/hash/hash-table.test.ts +97 -0
  191. package/test/unit/data-structures/heap/heap.test.ts +7 -8
  192. package/test/unit/data-structures/heap/max-heap.test.ts +7 -5
  193. package/test/unit/data-structures/heap/min-heap.test.ts +6 -5
  194. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +8 -9
  195. package/test/unit/data-structures/linked-list/linked-list.test.ts +2 -4
  196. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +57 -7
  197. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +3 -3
  198. package/test/unit/data-structures/matrix/matrix.test.ts +54 -0
  199. package/test/unit/data-structures/matrix/matrix2d.test.ts +138 -0
  200. package/test/unit/data-structures/matrix/navigator.test.ts +79 -0
  201. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +5 -7
  202. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +13 -13
  203. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +8 -8
  204. package/test/unit/data-structures/queue/deque.test.ts +130 -0
  205. package/test/unit/data-structures/queue/queue.test.ts +167 -4
  206. package/test/unit/data-structures/stack/stack.test.ts +67 -0
  207. package/test/unit/data-structures/tree/tree.test.ts +39 -0
  208. package/test/unit/data-structures/trie/trie.test.ts +95 -0
  209. package/test/utils/magnitude.ts +3 -3
  210. package/tsconfig.json +3 -12
  211. package/tsconfig.prod.json +25 -0
  212. package/umd/bundle.min.js +1 -1
  213. package/umd/bundle.min.js.map +1 -1
  214. package/.auto-changelog +0 -9
  215. package/.gitattributes +0 -112
  216. package/.idea/data-structure-typed.iml +0 -19
  217. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  218. package/.idea/misc.xml +0 -6
  219. package/.idea/modules.xml +0 -8
  220. package/.idea/vcs.xml +0 -6
  221. package/.prettierignore +0 -6
  222. package/webpack.config.js +0 -28
@@ -1,13 +1,13 @@
1
1
  <!DOCTYPE html>
2
- <html lang="en">
2
+ <html lang='en'>
3
3
  <head>
4
- <meta charset="UTF-8">
4
+ <meta charset='UTF-8'>
5
5
  <title>CDN Test</title>
6
- <script src="https://cdn.jsdelivr.net/npm/data-structure-typed/umd/bundle.min.js"></script>
6
+ <script src='https://cdn.jsdelivr.net/npm/data-structure-typed/umd/bundle.min.js'></script>
7
7
  </head>
8
8
  <body>
9
- <div id="app">
10
- <ul class="modules">
9
+ <div id='app'>
10
+ <ul class='modules'>
11
11
 
12
12
  </ul>
13
13
  </div>
@@ -36,7 +36,7 @@
36
36
  last = queue.dequeue();
37
37
  }
38
38
 
39
- console.log(performance.now() - startTime)
39
+ console.log(performance.now() - startTime);
40
40
  </script>
41
41
 
42
42
  </body>
@@ -2,7 +2,6 @@ import {AVLTree} from '../../../../src';
2
2
 
3
3
  describe('AVL Tree Test', () => {
4
4
  it('should perform various operations on a AVL Tree', () => {
5
-
6
5
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
7
6
  const tree = new AVLTree();
8
7
 
@@ -16,7 +15,6 @@ describe('AVL Tree Test', () => {
16
15
  const getNodeById = tree.get(10, 'id');
17
16
  expect(getNodeById?.id).toBe(10);
18
17
 
19
-
20
18
  const getMinNodeByRoot = tree.getLeftMost();
21
19
  expect(getMinNodeByRoot?.id).toBe(1);
22
20
 
@@ -30,7 +28,6 @@ describe('AVL Tree Test', () => {
30
28
  const lesserSum = tree.lesserSum(10);
31
29
  expect(lesserSum).toBe(45);
32
30
 
33
-
34
31
  // 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
32
  expect(node15?.val).toBe(15);
36
33
 
@@ -44,56 +41,56 @@ describe('AVL Tree Test', () => {
44
41
  expect(bfs[0].id).toBe(8);
45
42
  expect(bfs[bfs.length - 1].id).toBe(16);
46
43
 
47
- expect(tree.remove(11, true)[0].deleted?.id).toBe(11);
44
+ expect(tree.remove(11)[0].deleted?.id).toBe(11);
48
45
  expect(tree.isAVLBalanced()).toBe(true);
49
46
  expect(node15 && tree.getHeight(node15)).toBe(2);
50
47
 
51
- expect(tree.remove(1, true)[0].deleted?.id).toBe(1);
48
+ expect(tree.remove(1)[0].deleted?.id).toBe(1);
52
49
  expect(tree.isAVLBalanced()).toBe(true);
53
50
  expect(tree.getHeight()).toBe(4);
54
51
 
55
- expect(tree.remove(4, true)[0].deleted?.id).toBe(4);
52
+ expect(tree.remove(4)[0].deleted?.id).toBe(4);
56
53
  expect(tree.isAVLBalanced()).toBe(true);
57
54
  expect(tree.getHeight()).toBe(4);
58
55
 
59
- expect(tree.remove(10, true)[0].deleted?.id).toBe(10);
56
+ expect(tree.remove(10)[0].deleted?.id).toBe(10);
60
57
  expect(tree.isAVLBalanced()).toBe(true);
61
58
  expect(tree.getHeight()).toBe(3);
62
59
 
63
- expect(tree.remove(15, true)[0].deleted?.id).toBe(15);
60
+ expect(tree.remove(15)[0].deleted?.id).toBe(15);
64
61
  expect(tree.isAVLBalanced()).toBe(true);
65
62
 
66
63
  expect(tree.getHeight()).toBe(3);
67
64
 
68
- expect(tree.remove(5, true)[0].deleted?.id).toBe(5);
65
+ expect(tree.remove(5)[0].deleted?.id).toBe(5);
69
66
  expect(tree.isAVLBalanced()).toBe(true);
70
67
  expect(tree.getHeight()).toBe(3);
71
68
 
72
- expect(tree.remove(13, true)[0].deleted?.id).toBe(13);
69
+ expect(tree.remove(13)[0].deleted?.id).toBe(13);
73
70
  expect(tree.isAVLBalanced()).toBe(true);
74
71
  expect(tree.getHeight()).toBe(3);
75
72
 
76
- expect(tree.remove(3, true)[0].deleted?.id).toBe(3);
73
+ expect(tree.remove(3)[0].deleted?.id).toBe(3);
77
74
  expect(tree.isAVLBalanced()).toBe(true);
78
75
  expect(tree.getHeight()).toBe(3);
79
76
 
80
- expect(tree.remove(8, true)[0].deleted?.id).toBe(8);
77
+ expect(tree.remove(8)[0].deleted?.id).toBe(8);
81
78
  expect(tree.isAVLBalanced()).toBe(true);
82
79
  expect(tree.getHeight()).toBe(3);
83
80
 
84
- expect(tree.remove(6, true)[0].deleted?.id).toBe(6);
85
- expect(tree.remove(6, true).length).toBe(0);
81
+ expect(tree.remove(6)[0].deleted?.id).toBe(6);
82
+ expect(tree.remove(6).length).toBe(0);
86
83
  expect(tree.isAVLBalanced()).toBe(true);
87
84
  expect(tree.getHeight()).toBe(2);
88
85
 
89
- expect(tree.remove(7, true)[0].deleted?.id).toBe(7);
86
+ expect(tree.remove(7)[0].deleted?.id).toBe(7);
90
87
  expect(tree.isAVLBalanced()).toBe(true);
91
88
  expect(tree.getHeight()).toBe(2);
92
89
 
93
- expect(tree.remove(9, true)[0].deleted?.id).toBe(9);
90
+ expect(tree.remove(9)[0].deleted?.id).toBe(9);
94
91
  expect(tree.isAVLBalanced()).toBe(true);
95
92
  expect(tree.getHeight()).toBe(2);
96
- expect(tree.remove(14, true)[0].deleted?.id).toBe(14);
93
+ expect(tree.remove(14)[0].deleted?.id).toBe(14);
97
94
  expect(tree.isAVLBalanced()).toBe(true);
98
95
  expect(tree.getHeight()).toBe(1);
99
96
 
@@ -0,0 +1,142 @@
1
+ import {BinaryTreeNode} from '../../../../src';
2
+ import {BinaryTree} from 'binary-tree-typed';
3
+
4
+ describe('BinaryTreeNode', () => {
5
+ it('should create an instance of BinaryTreeNode', () => {
6
+ const node = new BinaryTreeNode<number>(1);
7
+ expect(node).toBeInstanceOf(BinaryTreeNode);
8
+ });
9
+
10
+ it('should set and get the ID correctly', () => {
11
+ const node = new BinaryTreeNode<number>(1);
12
+ expect(node.id).toBe(1);
13
+
14
+ node.id = 2;
15
+ expect(node.id).toBe(2);
16
+ });
17
+
18
+ it('should set and get the value correctly', () => {
19
+ const node = new BinaryTreeNode<number>(1, 42);
20
+ expect(node.val).toBe(42);
21
+
22
+ node.val = 55;
23
+ expect(node.val).toBe(55);
24
+ });
25
+
26
+ it('should set and get the left child correctly', () => {
27
+ const node1 = new BinaryTreeNode<number>(1);
28
+ const node2 = new BinaryTreeNode<number>(2);
29
+
30
+ node1.left = node2;
31
+
32
+ expect(node1.left).toBe(node2);
33
+ expect(node2.parent).toBe(node1);
34
+ });
35
+
36
+ it('should set and get the right child correctly', () => {
37
+ const node1 = new BinaryTreeNode<number>(1);
38
+ const node2 = new BinaryTreeNode<number>(2);
39
+
40
+ node1.right = node2;
41
+
42
+ expect(node1.right).toBe(node2);
43
+ expect(node2.parent).toBe(node1);
44
+ });
45
+
46
+ it('should set and get the parent correctly', () => {
47
+ const node1 = new BinaryTreeNode<number>(1);
48
+ const node2 = new BinaryTreeNode<number>(2);
49
+
50
+ node1.left = node2;
51
+
52
+ expect(node2.parent).toBe(node1);
53
+ expect(node1.left).toBe(node2);
54
+ });
55
+
56
+ it('should set and get the height correctly', () => {
57
+ const node = new BinaryTreeNode<number>(1);
58
+ expect(node.height).toBe(0);
59
+
60
+ node.height = 3;
61
+ expect(node.height).toBe(3);
62
+ });
63
+
64
+ it('should determine family position correctly', () => {
65
+ const root = new BinaryTreeNode<number>(1);
66
+ const leftChild = new BinaryTreeNode<number>(2);
67
+ const rightChild = new BinaryTreeNode<number>(3);
68
+
69
+ root.left = leftChild;
70
+ root.right = rightChild;
71
+
72
+ expect(leftChild.familyPosition).toBe('LEFT');
73
+ expect(rightChild.familyPosition).toBe('RIGHT');
74
+ expect(root.familyPosition).toBe('ROOT');
75
+ });
76
+ });
77
+
78
+ describe('BinaryTree', () => {
79
+ let binaryTree: BinaryTree;
80
+
81
+ beforeEach(() => {
82
+ binaryTree = new BinaryTree();
83
+ });
84
+
85
+ afterEach(() => {
86
+ binaryTree.clear();
87
+ });
88
+
89
+ test('should add a node', () => {
90
+ const node = binaryTree.add(1);
91
+ expect(node).not.toBeNull();
92
+ expect(binaryTree.size).toBe(1);
93
+ });
94
+
95
+ test('should remove a node', () => {
96
+ const node = binaryTree.add(1);
97
+ expect(binaryTree.size).toBe(1);
98
+
99
+ if (node) {
100
+ const result = binaryTree.remove(node);
101
+ expect(result).toHaveLength(1);
102
+ expect(binaryTree.size).toBe(0);
103
+ }
104
+ });
105
+
106
+ test('should add and find nodes', () => {
107
+ binaryTree.add(1);
108
+ binaryTree.add(2);
109
+ binaryTree.add(3);
110
+
111
+ expect(binaryTree.has(1)).toBe(true);
112
+ expect(binaryTree.has(2)).toBe(true);
113
+ expect(binaryTree.has(3)).toBe(true);
114
+ expect(binaryTree.has(4)).toBe(false);
115
+ });
116
+
117
+ test('should traverse in-order', () => {
118
+ binaryTree.add(4);
119
+ binaryTree.add(2);
120
+ binaryTree.add(6);
121
+ binaryTree.add(1);
122
+ binaryTree.add(3);
123
+ binaryTree.add(5);
124
+ binaryTree.add(7);
125
+
126
+ const inOrder = binaryTree.DFS('in');
127
+
128
+ expect(inOrder).toEqual([1, 2, 3, 4, 5, 6, 7]);
129
+ });
130
+
131
+ test('should clear the tree', () => {
132
+ binaryTree.add(1);
133
+ binaryTree.add(2);
134
+
135
+ expect(binaryTree.size).toBe(2);
136
+
137
+ binaryTree.clear();
138
+
139
+ expect(binaryTree.size).toBe(0);
140
+ expect(binaryTree.root).toBeNull();
141
+ });
142
+ });
@@ -26,7 +26,6 @@ describe('BST operations test', () => {
26
26
  const nodeVal9 = bst.get(9, 'val');
27
27
  expect(nodeVal9?.id).toBe(9);
28
28
 
29
-
30
29
  const leftMost = bst.getLeftMost();
31
30
  expect(leftMost?.id).toBe(1);
32
31
 
@@ -56,7 +55,7 @@ describe('BST operations test', () => {
56
55
  expect(bfsNodesAfterBalanced[0].id).toBe(8);
57
56
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].id).toBe(16);
58
57
 
59
- const removed11 = bst.remove(11, true);
58
+ const removed11 = bst.remove(11);
60
59
  expect(removed11).toBeInstanceOf(Array);
61
60
  expect(removed11[0]).toBeDefined();
62
61
  expect(removed11[0].deleted).toBeDefined();
@@ -67,7 +66,7 @@ describe('BST operations test', () => {
67
66
 
68
67
  expect(bst.getHeight(15)).toBe(1);
69
68
 
70
- const removed1 = bst.remove(1, true);
69
+ const removed1 = bst.remove(1);
71
70
  expect(removed1).toBeInstanceOf(Array);
72
71
  expect(removed1[0]).toBeDefined();
73
72
  expect(removed1[0].deleted).toBeDefined();
@@ -77,7 +76,7 @@ describe('BST operations test', () => {
77
76
 
78
77
  expect(bst.getHeight()).toBe(4);
79
78
 
80
- const removed4 = bst.remove(4, true);
79
+ const removed4 = bst.remove(4);
81
80
  expect(removed4).toBeInstanceOf(Array);
82
81
  expect(removed4[0]).toBeDefined();
83
82
  expect(removed4[0].deleted).toBeDefined();
@@ -85,7 +84,7 @@ describe('BST operations test', () => {
85
84
  expect(bst.isAVLBalanced()).toBe(true);
86
85
  expect(bst.getHeight()).toBe(4);
87
86
 
88
- const removed10 = bst.remove(10, true);
87
+ const removed10 = bst.remove(10);
89
88
  expect(removed10).toBeInstanceOf(Array);
90
89
  expect(removed10[0]).toBeDefined();
91
90
  expect(removed10[0].deleted).toBeDefined();
@@ -93,7 +92,7 @@ describe('BST operations test', () => {
93
92
  expect(bst.isAVLBalanced()).toBe(false);
94
93
  expect(bst.getHeight()).toBe(4);
95
94
 
96
- const removed15 = bst.remove(15, true);
95
+ const removed15 = bst.remove(15);
97
96
  expect(removed15).toBeInstanceOf(Array);
98
97
  expect(removed15[0]).toBeDefined();
99
98
  expect(removed15[0].deleted).toBeDefined();
@@ -102,7 +101,7 @@ describe('BST operations test', () => {
102
101
  expect(bst.isAVLBalanced()).toBe(true);
103
102
  expect(bst.getHeight()).toBe(3);
104
103
 
105
- const removed5 = bst.remove(5, true);
104
+ const removed5 = bst.remove(5);
106
105
  expect(removed5).toBeInstanceOf(Array);
107
106
  expect(removed5[0]).toBeDefined();
108
107
  expect(removed5[0].deleted).toBeDefined();
@@ -111,7 +110,7 @@ describe('BST operations test', () => {
111
110
  expect(bst.isAVLBalanced()).toBe(true);
112
111
  expect(bst.getHeight()).toBe(3);
113
112
 
114
- const removed13 = bst.remove(13, true);
113
+ const removed13 = bst.remove(13);
115
114
  expect(removed13).toBeInstanceOf(Array);
116
115
  expect(removed13[0]).toBeDefined();
117
116
  expect(removed13[0].deleted).toBeDefined();
@@ -119,7 +118,7 @@ describe('BST operations test', () => {
119
118
  expect(bst.isAVLBalanced()).toBe(true);
120
119
  expect(bst.getHeight()).toBe(3);
121
120
 
122
- const removed3 = bst.remove(3, true);
121
+ const removed3 = bst.remove(3);
123
122
  expect(removed3).toBeInstanceOf(Array);
124
123
  expect(removed3[0]).toBeDefined();
125
124
  expect(removed3[0].deleted).toBeDefined();
@@ -127,7 +126,7 @@ describe('BST operations test', () => {
127
126
  expect(bst.isAVLBalanced()).toBe(false);
128
127
  expect(bst.getHeight()).toBe(3);
129
128
 
130
- const removed8 = bst.remove(8, true);
129
+ const removed8 = bst.remove(8);
131
130
  expect(removed8).toBeInstanceOf(Array);
132
131
  expect(removed8[0]).toBeDefined();
133
132
  expect(removed8[0].deleted).toBeDefined();
@@ -135,16 +134,16 @@ describe('BST operations test', () => {
135
134
  expect(bst.isAVLBalanced()).toBe(true);
136
135
  expect(bst.getHeight()).toBe(3);
137
136
 
138
- const removed6 = bst.remove(6, true);
137
+ const removed6 = bst.remove(6);
139
138
  expect(removed6).toBeInstanceOf(Array);
140
139
  expect(removed6[0]).toBeDefined();
141
140
  expect(removed6[0].deleted).toBeDefined();
142
141
  if (removed6[0].deleted) expect(removed6[0].deleted.id).toBe(6);
143
- expect(bst.remove(6, true).length).toBe(0);
142
+ expect(bst.remove(6).length).toBe(0);
144
143
  expect(bst.isAVLBalanced()).toBe(false);
145
144
  expect(bst.getHeight()).toBe(3);
146
145
 
147
- const removed7 = bst.remove(7, true);
146
+ const removed7 = bst.remove(7);
148
147
  expect(removed7).toBeInstanceOf(Array);
149
148
  expect(removed7[0]).toBeDefined();
150
149
  expect(removed7[0].deleted).toBeDefined();
@@ -152,7 +151,7 @@ describe('BST operations test', () => {
152
151
  expect(bst.isAVLBalanced()).toBe(false);
153
152
  expect(bst.getHeight()).toBe(3);
154
153
 
155
- const removed9 = bst.remove(9, true);
154
+ const removed9 = bst.remove(9);
156
155
  expect(removed9).toBeInstanceOf(Array);
157
156
  expect(removed9[0]).toBeDefined();
158
157
  expect(removed9[0].deleted).toBeDefined();
@@ -160,7 +159,7 @@ describe('BST operations test', () => {
160
159
  expect(bst.isAVLBalanced()).toBe(false);
161
160
  expect(bst.getHeight()).toBe(3);
162
161
 
163
- const removed14 = bst.remove(14, true);
162
+ const removed14 = bst.remove(14);
164
163
  expect(removed14).toBeInstanceOf(Array);
165
164
  expect(removed14[0]).toBeDefined();
166
165
  expect(removed14[0].deleted).toBeDefined();
@@ -168,7 +167,6 @@ describe('BST operations test', () => {
168
167
  expect(bst.isAVLBalanced()).toBe(false);
169
168
  expect(bst.getHeight()).toBe(2);
170
169
 
171
-
172
170
  expect(bst.isAVLBalanced()).toBe(false);
173
171
 
174
172
  const bfsIDs = bst.BFS();
@@ -180,21 +178,34 @@ describe('BST operations test', () => {
180
178
  expect(bfsNodes[0].id).toBe(2);
181
179
  expect(bfsNodes[1].id).toBe(12);
182
180
  expect(bfsNodes[2].id).toBe(16);
183
-
184
181
  });
185
182
 
186
183
  it('should perform various operations on a Binary Search Tree with object values', () => {
187
- const objBST = new BST<BSTNode<{ id: number, keyA: number }>>();
184
+ const objBST = new BST<BSTNode<{id: number; keyA: number}>>();
188
185
  expect(objBST).toBeInstanceOf(BST);
189
186
  objBST.add(11, {id: 11, keyA: 11});
190
187
  objBST.add(3, {id: 3, keyA: 3});
191
- const values = [{id: 15, keyA: 15}, {id: 1, keyA: 1}, {id: 8, keyA: 8},
192
- {id: 13, keyA: 13}, {id: 16, keyA: 16}, {id: 2, keyA: 2},
193
- {id: 6, keyA: 6}, {id: 9, keyA: 9}, {id: 12, keyA: 12},
194
- {id: 14, keyA: 14}, {id: 4, keyA: 4}, {id: 7, keyA: 7},
195
- {id: 10, keyA: 10}, {id: 5, keyA: 5}];
196
-
197
- objBST.addMany(values.map(item => item.id), values);
188
+ const values = [
189
+ {id: 15, keyA: 15},
190
+ {id: 1, keyA: 1},
191
+ {id: 8, keyA: 8},
192
+ {id: 13, keyA: 13},
193
+ {id: 16, keyA: 16},
194
+ {id: 2, keyA: 2},
195
+ {id: 6, keyA: 6},
196
+ {id: 9, keyA: 9},
197
+ {id: 12, keyA: 12},
198
+ {id: 14, keyA: 14},
199
+ {id: 4, keyA: 4},
200
+ {id: 7, keyA: 7},
201
+ {id: 10, keyA: 10},
202
+ {id: 5, keyA: 5}
203
+ ];
204
+
205
+ objBST.addMany(
206
+ values.map(item => item.id),
207
+ values
208
+ );
198
209
 
199
210
  expect(objBST.root).toBeInstanceOf(BSTNode);
200
211
 
@@ -242,7 +253,7 @@ describe('BST operations test', () => {
242
253
  expect(bfsNodesAfterBalanced[0].id).toBe(8);
243
254
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].id).toBe(16);
244
255
 
245
- const removed11 = objBST.remove(11, true);
256
+ const removed11 = objBST.remove(11);
246
257
  expect(removed11).toBeInstanceOf(Array);
247
258
  expect(removed11[0]).toBeDefined();
248
259
  expect(removed11[0].deleted).toBeDefined();
@@ -253,7 +264,7 @@ describe('BST operations test', () => {
253
264
 
254
265
  expect(node15 && objBST.getHeight(node15)).toBe(2);
255
266
 
256
- const removed1 = objBST.remove(1, true);
267
+ const removed1 = objBST.remove(1);
257
268
  expect(removed1).toBeInstanceOf(Array);
258
269
  expect(removed1[0]).toBeDefined();
259
270
  expect(removed1[0].deleted).toBeDefined();
@@ -263,7 +274,7 @@ describe('BST operations test', () => {
263
274
 
264
275
  expect(objBST.getHeight()).toBe(4);
265
276
 
266
- const removed4 = objBST.remove(4, true);
277
+ const removed4 = objBST.remove(4);
267
278
  expect(removed4).toBeInstanceOf(Array);
268
279
  expect(removed4[0]).toBeDefined();
269
280
  expect(removed4[0].deleted).toBeDefined();
@@ -271,7 +282,7 @@ describe('BST operations test', () => {
271
282
  expect(objBST.isAVLBalanced()).toBe(true);
272
283
  expect(objBST.getHeight()).toBe(4);
273
284
 
274
- const removed10 = objBST.remove(10, true);
285
+ const removed10 = objBST.remove(10);
275
286
  expect(removed10).toBeInstanceOf(Array);
276
287
  expect(removed10[0]).toBeDefined();
277
288
  expect(removed10[0].deleted).toBeDefined();
@@ -279,7 +290,7 @@ describe('BST operations test', () => {
279
290
  expect(objBST.isAVLBalanced()).toBe(false);
280
291
  expect(objBST.getHeight()).toBe(4);
281
292
 
282
- const removed15 = objBST.remove(15, true);
293
+ const removed15 = objBST.remove(15);
283
294
  expect(removed15).toBeInstanceOf(Array);
284
295
  expect(removed15[0]).toBeDefined();
285
296
  expect(removed15[0].deleted).toBeDefined();
@@ -288,7 +299,7 @@ describe('BST operations test', () => {
288
299
  expect(objBST.isAVLBalanced()).toBe(true);
289
300
  expect(objBST.getHeight()).toBe(3);
290
301
 
291
- const removed5 = objBST.remove(5, true);
302
+ const removed5 = objBST.remove(5);
292
303
  expect(removed5).toBeInstanceOf(Array);
293
304
  expect(removed5[0]).toBeDefined();
294
305
  expect(removed5[0].deleted).toBeDefined();
@@ -297,7 +308,7 @@ describe('BST operations test', () => {
297
308
  expect(objBST.isAVLBalanced()).toBe(true);
298
309
  expect(objBST.getHeight()).toBe(3);
299
310
 
300
- const removed13 = objBST.remove(13, true);
311
+ const removed13 = objBST.remove(13);
301
312
  expect(removed13).toBeInstanceOf(Array);
302
313
  expect(removed13[0]).toBeDefined();
303
314
  expect(removed13[0].deleted).toBeDefined();
@@ -305,7 +316,7 @@ describe('BST operations test', () => {
305
316
  expect(objBST.isAVLBalanced()).toBe(true);
306
317
  expect(objBST.getHeight()).toBe(3);
307
318
 
308
- const removed3 = objBST.remove(3, true);
319
+ const removed3 = objBST.remove(3);
309
320
  expect(removed3).toBeInstanceOf(Array);
310
321
  expect(removed3[0]).toBeDefined();
311
322
  expect(removed3[0].deleted).toBeDefined();
@@ -313,7 +324,7 @@ describe('BST operations test', () => {
313
324
  expect(objBST.isAVLBalanced()).toBe(false);
314
325
  expect(objBST.getHeight()).toBe(3);
315
326
 
316
- const removed8 = objBST.remove(8, true);
327
+ const removed8 = objBST.remove(8);
317
328
  expect(removed8).toBeInstanceOf(Array);
318
329
  expect(removed8[0]).toBeDefined();
319
330
  expect(removed8[0].deleted).toBeDefined();
@@ -321,16 +332,16 @@ describe('BST operations test', () => {
321
332
  expect(objBST.isAVLBalanced()).toBe(true);
322
333
  expect(objBST.getHeight()).toBe(3);
323
334
 
324
- const removed6 = objBST.remove(6, true);
335
+ const removed6 = objBST.remove(6);
325
336
  expect(removed6).toBeInstanceOf(Array);
326
337
  expect(removed6[0]).toBeDefined();
327
338
  expect(removed6[0].deleted).toBeDefined();
328
339
  if (removed6[0].deleted) expect(removed6[0].deleted.id).toBe(6);
329
- expect(objBST.remove(6, true).length).toBe(0);
340
+ expect(objBST.remove(6).length).toBe(0);
330
341
  expect(objBST.isAVLBalanced()).toBe(false);
331
342
  expect(objBST.getHeight()).toBe(3);
332
343
 
333
- const removed7 = objBST.remove(7, true);
344
+ const removed7 = objBST.remove(7);
334
345
  expect(removed7).toBeInstanceOf(Array);
335
346
  expect(removed7[0]).toBeDefined();
336
347
  expect(removed7[0].deleted).toBeDefined();
@@ -338,7 +349,7 @@ describe('BST operations test', () => {
338
349
  expect(objBST.isAVLBalanced()).toBe(false);
339
350
  expect(objBST.getHeight()).toBe(3);
340
351
 
341
- const removed9 = objBST.remove(9, true);
352
+ const removed9 = objBST.remove(9);
342
353
  expect(removed9).toBeInstanceOf(Array);
343
354
  expect(removed9[0]).toBeDefined();
344
355
  expect(removed9[0].deleted).toBeDefined();
@@ -346,7 +357,7 @@ describe('BST operations test', () => {
346
357
  expect(objBST.isAVLBalanced()).toBe(false);
347
358
  expect(objBST.getHeight()).toBe(3);
348
359
 
349
- const removed14 = objBST.remove(14, true);
360
+ const removed14 = objBST.remove(14);
350
361
  expect(removed14).toBeInstanceOf(Array);
351
362
  expect(removed14[0]).toBeDefined();
352
363
  expect(removed14[0].deleted).toBeDefined();
@@ -354,7 +365,6 @@ describe('BST operations test', () => {
354
365
  expect(objBST.isAVLBalanced()).toBe(false);
355
366
  expect(objBST.getHeight()).toBe(2);
356
367
 
357
-
358
368
  expect(objBST.isAVLBalanced()).toBe(false);
359
369
 
360
370
  const bfsIDs = objBST.BFS();
@@ -366,6 +376,5 @@ describe('BST operations test', () => {
366
376
  expect(bfsNodes[0].id).toBe(2);
367
377
  expect(bfsNodes[1].id).toBe(12);
368
378
  expect(bfsNodes[2].id).toBe(16);
369
-
370
379
  });
371
380
  });
@@ -6,52 +6,60 @@ describe('Overall BinaryTree Test', () => {
6
6
  bst.add(11);
7
7
  bst.add(3);
8
8
  bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
9
- bst.size === 16; // true
10
- expect(bst.size).toBe(16); // true
11
- bst.has(6); // true
12
- expect(bst.has(6)).toBe(true); // true
13
- const node6 = bst.get(6);
9
+ bst.size === 16; // true
10
+ expect(bst.size).toBe(16); // true
11
+ bst.has(6); // true
12
+ expect(bst.has(6)).toBe(true); // true
14
13
  bst.getHeight(6) === 2; // true
15
- bst.getHeight() === 5; // true
16
- bst.getDepth(6) === 3; // true
14
+ bst.getHeight() === 5; // true
15
+ bst.getDepth(6) === 3; // true
17
16
  expect(bst.getHeight(6)).toBe(2); // true
18
- expect(bst.getHeight()).toBe(5); // true
19
- expect(bst.getDepth(6)).toBe(3); // true
17
+ expect(bst.getHeight()).toBe(5); // true
18
+ expect(bst.getDepth(6)).toBe(3); // true
20
19
  const leftMost = bst.getLeftMost();
21
- leftMost?.id === 1; // true
20
+ leftMost?.id === 1; // true
22
21
  expect(leftMost?.id).toBe(1);
23
22
  bst.remove(6);
24
- bst.get(6); // null
23
+ bst.get(6); // null
25
24
  expect(bst.get(6)).toBeNull();
26
- bst.isAVLBalanced(); // true or false
25
+ bst.isAVLBalanced(); // true or false
27
26
  expect(bst.isAVLBalanced()).toBe(true);
28
27
  const bfsIDs = bst.BFS();
29
- bfsIDs[0] === 11; // true
28
+ bfsIDs[0] === 11; // true
30
29
  expect(bfsIDs[0]).toBe(11);
31
30
 
32
- const objBST = new BST<BSTNode<{ id: number, keyA: number }>>();
31
+ const objBST = new BST<BSTNode<{id: number; keyA: number}>>();
33
32
  objBST.add(11, {id: 11, keyA: 11});
34
33
  objBST.add(3, {id: 3, keyA: 3});
35
34
 
36
- objBST.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5],
35
+ objBST.addMany(
36
+ [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5],
37
37
  [
38
- {id: 15, keyA: 15}, {id: 1, keyA: 1}, {id: 8, keyA: 8},
39
- {id: 13, keyA: 13}, {id: 16, keyA: 16}, {id: 2, keyA: 2},
40
- {id: 6, keyA: 6}, {id: 9, keyA: 9}, {id: 12, keyA: 12},
41
- {id: 14, keyA: 14}, {id: 4, keyA: 4}, {id: 7, keyA: 7},
42
- {id: 10, keyA: 10}, {id: 5, keyA: 5}
43
- ]);
38
+ {id: 15, keyA: 15},
39
+ {id: 1, keyA: 1},
40
+ {id: 8, keyA: 8},
41
+ {id: 13, keyA: 13},
42
+ {id: 16, keyA: 16},
43
+ {id: 2, keyA: 2},
44
+ {id: 6, keyA: 6},
45
+ {id: 9, keyA: 9},
46
+ {id: 12, keyA: 12},
47
+ {id: 14, keyA: 14},
48
+ {id: 4, keyA: 4},
49
+ {id: 7, keyA: 7},
50
+ {id: 10, keyA: 10},
51
+ {id: 5, keyA: 5}
52
+ ]
53
+ );
44
54
 
45
55
  objBST.remove(11);
46
56
 
47
-
48
57
  const avlTree = new AVLTree();
49
- avlTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5])
50
- avlTree.isAVLBalanced(); // true
51
- expect(avlTree.isAVLBalanced()).toBe(true); // true
58
+ avlTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
59
+ avlTree.isAVLBalanced(); // true
60
+ expect(avlTree.isAVLBalanced()).toBe(true); // true
52
61
  avlTree.remove(10);
53
- avlTree.isAVLBalanced(); // true
54
- expect(avlTree.isAVLBalanced()).toBe(true); // true
55
-
62
+ avlTree.isAVLBalanced(); // true
63
+ expect(avlTree.isAVLBalanced()).toBe(true); // true
56
64
  });
57
65
  });