data-structure-typed 1.15.1 → 1.16.1

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 (224) hide show
  1. package/README.md +398 -27
  2. package/dist/data-structures/binary-tree/binary-tree.d.ts +30 -30
  3. package/dist/data-structures/binary-tree/binary-tree.js +55 -55
  4. package/dist/data-structures/binary-tree/segment-tree.d.ts +17 -17
  5. package/dist/data-structures/binary-tree/segment-tree.js +30 -30
  6. package/dist/data-structures/graph/abstract-graph.d.ts +6 -6
  7. package/dist/data-structures/graph/abstract-graph.js +6 -6
  8. package/dist/data-structures/graph/directed-graph.d.ts +4 -4
  9. package/dist/data-structures/graph/directed-graph.js +6 -6
  10. package/dist/data-structures/graph/undirected-graph.d.ts +3 -3
  11. package/dist/data-structures/hash/coordinate-map.d.ts +2 -2
  12. package/dist/data-structures/hash/coordinate-set.d.ts +2 -2
  13. package/dist/data-structures/heap/heap.d.ts +40 -25
  14. package/dist/data-structures/heap/heap.js +72 -27
  15. package/dist/data-structures/heap/max-heap.d.ts +3 -3
  16. package/dist/data-structures/heap/min-heap.d.ts +3 -3
  17. package/dist/data-structures/index.d.ts +1 -0
  18. package/dist/data-structures/index.js +1 -0
  19. package/dist/data-structures/linked-list/doubly-linked-list.d.ts +9 -9
  20. package/dist/data-structures/linked-list/doubly-linked-list.js +12 -12
  21. package/dist/data-structures/linked-list/singly-linked-list.d.ts +7 -7
  22. package/dist/data-structures/priority-queue/max-priority-queue.d.ts +4 -5
  23. package/dist/data-structures/priority-queue/max-priority-queue.js +30 -6
  24. package/dist/data-structures/priority-queue/min-priority-queue.d.ts +4 -5
  25. package/dist/data-structures/priority-queue/min-priority-queue.js +31 -6
  26. package/dist/data-structures/priority-queue/priority-queue.d.ts +20 -9
  27. package/dist/data-structures/priority-queue/priority-queue.js +34 -28
  28. package/dist/data-structures/queue/deque.d.ts +1 -1
  29. package/dist/data-structures/tree/index.d.ts +1 -0
  30. package/dist/data-structures/tree/index.js +17 -0
  31. package/dist/data-structures/tree/tree.d.ts +9 -0
  32. package/dist/data-structures/tree/tree.js +52 -0
  33. package/dist/data-structures/types/heap.d.ts +0 -4
  34. package/dist/utils/types/utils.d.ts +1 -3
  35. package/dist/utils/types/utils.js +0 -14
  36. package/dist/utils/utils.js +0 -197
  37. package/docs/.nojekyll +1 -0
  38. package/docs/assets/highlight.css +92 -0
  39. package/docs/assets/main.js +58 -0
  40. package/docs/assets/search.js +1 -0
  41. package/docs/assets/style.css +1367 -0
  42. package/docs/classes/AVLTree.html +2192 -0
  43. package/docs/classes/AVLTreeNode.html +574 -0
  44. package/docs/classes/AaTree.html +150 -0
  45. package/docs/classes/AbstractEdge.html +269 -0
  46. package/docs/classes/AbstractGraph.html +927 -0
  47. package/docs/classes/AbstractVertex.html +215 -0
  48. package/docs/classes/ArrayDeque.html +417 -0
  49. package/docs/classes/BST.html +2038 -0
  50. package/docs/classes/BSTNode.html +570 -0
  51. package/docs/classes/BTree.html +150 -0
  52. package/docs/classes/BinaryIndexedTree.html +289 -0
  53. package/docs/classes/BinaryTree.html +1827 -0
  54. package/docs/classes/BinaryTreeNode.html +533 -0
  55. package/docs/classes/Character.html +198 -0
  56. package/docs/classes/CoordinateMap.html +469 -0
  57. package/docs/classes/CoordinateSet.html +430 -0
  58. package/docs/classes/Deque.html +767 -0
  59. package/docs/classes/DirectedEdge.html +354 -0
  60. package/docs/classes/DirectedGraph.html +1243 -0
  61. package/docs/classes/DirectedVertex.html +226 -0
  62. package/docs/classes/DoublyLinkedList.html +733 -0
  63. package/docs/classes/DoublyLinkedListNode.html +258 -0
  64. package/docs/classes/Heap.html +482 -0
  65. package/docs/classes/HeapItem.html +233 -0
  66. package/docs/classes/Matrix2D.html +480 -0
  67. package/docs/classes/MatrixNTI2D.html +218 -0
  68. package/docs/classes/MaxHeap.html +500 -0
  69. package/docs/classes/MaxPriorityQueue.html +809 -0
  70. package/docs/classes/MinHeap.html +501 -0
  71. package/docs/classes/MinPriorityQueue.html +811 -0
  72. package/docs/classes/Navigator.html +291 -0
  73. package/docs/classes/ObjectDeque.html +423 -0
  74. package/docs/classes/PriorityQueue.html +733 -0
  75. package/docs/classes/Queue.html +370 -0
  76. package/docs/classes/RBTree.html +150 -0
  77. package/docs/classes/SegmentTree.html +345 -0
  78. package/docs/classes/SegmentTreeNode.html +418 -0
  79. package/docs/classes/SinglyLinkedList.html +1105 -0
  80. package/docs/classes/SinglyLinkedListNode.html +375 -0
  81. package/docs/classes/SplayTree.html +150 -0
  82. package/docs/classes/Stack.html +346 -0
  83. package/docs/classes/TreeMultiSet.html +2036 -0
  84. package/docs/classes/TreeNode.html +236 -0
  85. package/docs/classes/Trie.html +350 -0
  86. package/docs/classes/TrieNode.html +258 -0
  87. package/docs/classes/TwoThreeTree.html +150 -0
  88. package/docs/classes/UndirectedEdge.html +313 -0
  89. package/docs/classes/UndirectedGraph.html +1080 -0
  90. package/docs/classes/UndirectedVertex.html +226 -0
  91. package/docs/classes/Vector2D.html +783 -0
  92. package/docs/enums/CP.html +159 -0
  93. package/docs/enums/FamilyPosition.html +159 -0
  94. package/docs/enums/LoopType.html +160 -0
  95. package/docs/index.html +494 -0
  96. package/docs/interfaces/AVLTreeDeleted.html +161 -0
  97. package/docs/interfaces/BinaryTreeNodeObj.html +168 -0
  98. package/docs/interfaces/HeapOptions.html +167 -0
  99. package/docs/interfaces/IDirectedGraph.html +243 -0
  100. package/docs/interfaces/IGraph.html +427 -0
  101. package/docs/interfaces/NavigatorParams.html +197 -0
  102. package/docs/interfaces/PriorityQueueOptions.html +168 -0
  103. package/docs/modules.html +218 -0
  104. package/docs/types/BSTComparator.html +140 -0
  105. package/docs/types/BSTDeletedResult.html +137 -0
  106. package/docs/types/BinaryTreeDeleted.html +137 -0
  107. package/docs/types/BinaryTreeNodeId.html +125 -0
  108. package/docs/types/BinaryTreeNodePropertyName.html +125 -0
  109. package/docs/types/DFSOrderPattern.html +125 -0
  110. package/docs/types/DijkstraResult.html +145 -0
  111. package/docs/types/Direction.html +125 -0
  112. package/docs/types/DoublyLinkedListGetBy.html +125 -0
  113. package/docs/types/NodeOrPropertyName.html +125 -0
  114. package/docs/types/PriorityQueueComparator.html +145 -0
  115. package/docs/types/PriorityQueueDFSOrderPattern.html +125 -0
  116. package/docs/types/ResultByProperty.html +130 -0
  117. package/docs/types/ResultsByProperty.html +130 -0
  118. package/docs/types/SegmentTreeNodeVal.html +125 -0
  119. package/docs/types/SpecifyOptional.html +132 -0
  120. package/docs/types/Thunk.html +133 -0
  121. package/docs/types/ToThunkFn.html +133 -0
  122. package/docs/types/TopologicalStatus.html +125 -0
  123. package/docs/types/TreeMultiSetDeletedResult.html +137 -0
  124. package/docs/types/TrlAsyncFn.html +138 -0
  125. package/docs/types/TrlFn.html +138 -0
  126. package/docs/types/Turning.html +125 -0
  127. package/docs/types/VertexId.html +125 -0
  128. package/{tests/unit/data-structures/binary-tree → notes}/bst.test.ts +11 -15
  129. package/notes/note.md +23 -0
  130. package/package.json +2 -4
  131. package/.idea/data-structure-typed.iml +0 -14
  132. package/.idea/modules.xml +0 -8
  133. package/.idea/vcs.xml +0 -6
  134. package/src/assets/complexities-diff.jpg +0 -0
  135. package/src/assets/data-structure-complexities.jpg +0 -0
  136. package/src/assets/logo.png +0 -0
  137. package/src/data-structures/binary-tree/aa-tree.ts +0 -3
  138. package/src/data-structures/binary-tree/avl-tree.ts +0 -293
  139. package/src/data-structures/binary-tree/b-tree.ts +0 -3
  140. package/src/data-structures/binary-tree/binary-indexed-tree.ts +0 -69
  141. package/src/data-structures/binary-tree/binary-tree.ts +0 -1485
  142. package/src/data-structures/binary-tree/bst.ts +0 -497
  143. package/src/data-structures/binary-tree/diagrams/avl-tree-inserting.gif +0 -0
  144. package/src/data-structures/binary-tree/diagrams/bst-rotation.gif +0 -0
  145. package/src/data-structures/binary-tree/diagrams/segment-tree.png +0 -0
  146. package/src/data-structures/binary-tree/index.ts +0 -11
  147. package/src/data-structures/binary-tree/rb-tree.ts +0 -3
  148. package/src/data-structures/binary-tree/segment-tree.ts +0 -248
  149. package/src/data-structures/binary-tree/splay-tree.ts +0 -3
  150. package/src/data-structures/binary-tree/tree-multiset.ts +0 -53
  151. package/src/data-structures/binary-tree/two-three-tree.ts +0 -3
  152. package/src/data-structures/diagrams/README.md +0 -5
  153. package/src/data-structures/graph/abstract-graph.ts +0 -956
  154. package/src/data-structures/graph/diagrams/adjacency-list-pros-cons.jpg +0 -0
  155. package/src/data-structures/graph/diagrams/adjacency-list.jpg +0 -0
  156. package/src/data-structures/graph/diagrams/adjacency-matrix-pros-cons.jpg +0 -0
  157. package/src/data-structures/graph/diagrams/adjacency-matrix.jpg +0 -0
  158. package/src/data-structures/graph/diagrams/dfs-can-do.jpg +0 -0
  159. package/src/data-structures/graph/diagrams/edge-list-pros-cons.jpg +0 -0
  160. package/src/data-structures/graph/diagrams/edge-list.jpg +0 -0
  161. package/src/data-structures/graph/diagrams/max-flow.jpg +0 -0
  162. package/src/data-structures/graph/diagrams/mst.jpg +0 -0
  163. package/src/data-structures/graph/diagrams/tarjan-articulation-point-bridge.png +0 -0
  164. package/src/data-structures/graph/diagrams/tarjan-complicate-simple.png +0 -0
  165. package/src/data-structures/graph/diagrams/tarjan-strongly-connected-component.png +0 -0
  166. package/src/data-structures/graph/diagrams/tarjan.mp4 +0 -0
  167. package/src/data-structures/graph/diagrams/tarjan.webp +0 -0
  168. package/src/data-structures/graph/directed-graph.ts +0 -424
  169. package/src/data-structures/graph/index.ts +0 -3
  170. package/src/data-structures/graph/undirected-graph.ts +0 -254
  171. package/src/data-structures/hash/coordinate-map.ts +0 -71
  172. package/src/data-structures/hash/coordinate-set.ts +0 -60
  173. package/src/data-structures/hash/hash-table.ts +0 -1
  174. package/src/data-structures/hash/index.ts +0 -6
  175. package/src/data-structures/hash/pair.ts +0 -1
  176. package/src/data-structures/hash/tree-map.ts +0 -1
  177. package/src/data-structures/hash/tree-set.ts +0 -1
  178. package/src/data-structures/heap/heap.ts +0 -156
  179. package/src/data-structures/heap/index.ts +0 -3
  180. package/src/data-structures/heap/max-heap.ts +0 -31
  181. package/src/data-structures/heap/min-heap.ts +0 -34
  182. package/src/data-structures/index.ts +0 -13
  183. package/src/data-structures/linked-list/doubly-linked-list.ts +0 -351
  184. package/src/data-structures/linked-list/index.ts +0 -2
  185. package/src/data-structures/linked-list/singly-linked-list.ts +0 -748
  186. package/src/data-structures/linked-list/skip-linked-list.ts +0 -1
  187. package/src/data-structures/matrix/index.ts +0 -4
  188. package/src/data-structures/matrix/matrix.ts +0 -27
  189. package/src/data-structures/matrix/matrix2d.ts +0 -208
  190. package/src/data-structures/matrix/navigator.ts +0 -122
  191. package/src/data-structures/matrix/vector2d.ts +0 -316
  192. package/src/data-structures/priority-queue/index.ts +0 -3
  193. package/src/data-structures/priority-queue/max-priority-queue.ts +0 -24
  194. package/src/data-structures/priority-queue/min-priority-queue.ts +0 -24
  195. package/src/data-structures/priority-queue/priority-queue.ts +0 -346
  196. package/src/data-structures/queue/deque.ts +0 -241
  197. package/src/data-structures/queue/index.ts +0 -2
  198. package/src/data-structures/queue/queue.ts +0 -120
  199. package/src/data-structures/stack/index.ts +0 -1
  200. package/src/data-structures/stack/stack.ts +0 -98
  201. package/src/data-structures/trie/index.ts +0 -1
  202. package/src/data-structures/trie/trie.ts +0 -225
  203. package/src/data-structures/types/abstract-graph.ts +0 -51
  204. package/src/data-structures/types/avl-tree.ts +0 -6
  205. package/src/data-structures/types/binary-tree.ts +0 -15
  206. package/src/data-structures/types/bst.ts +0 -5
  207. package/src/data-structures/types/directed-graph.ts +0 -18
  208. package/src/data-structures/types/doubly-linked-list.ts +0 -1
  209. package/src/data-structures/types/heap.ts +0 -8
  210. package/src/data-structures/types/index.ts +0 -13
  211. package/src/data-structures/types/navigator.ts +0 -13
  212. package/src/data-structures/types/priority-queue.ts +0 -9
  213. package/src/data-structures/types/segment-tree.ts +0 -1
  214. package/src/data-structures/types/singly-linked-list.ts +0 -1
  215. package/src/data-structures/types/tree-multiset.ts +0 -3
  216. package/src/index.ts +0 -1
  217. package/src/utils/index.ts +0 -2
  218. package/src/utils/types/index.ts +0 -1
  219. package/src/utils/types/utils.ts +0 -176
  220. package/src/utils/utils.ts +0 -290
  221. package/tests/unit/data-structures/graph/abstract-graph.ts +0 -0
  222. package/tests/unit/data-structures/graph/directed-graph.test.ts +0 -495
  223. package/tests/unit/data-structures/graph/index.ts +0 -3
  224. package/tests/unit/data-structures/graph/undirected-graph.ts +0 -0
package/README.md CHANGED
@@ -1,5 +1,25 @@
1
+ # What
1
2
 
2
- Javascript Data Structure, TypeScript Data Structure Library
3
+ ## Brief
4
+ Javascript & TypeScript Data Structure Library.
5
+
6
+ Meticulously crafted to empower developers with a versatile set of essential data structures. Our library includes a
7
+ wide range of data structures
8
+
9
+ ## Data Structures
10
+
11
+ Binary Tree, Binary Search Tree (BST), AVL Tree, Tree Multiset, Segment Tree, Binary Indexed Tree, Graph, Directed
12
+ Graph, Undirected Graph, Linked List, Singly Linked List, Doubly Linked List, Queue, Object Deque, Array Deque, Stack,
13
+ Hash, Coordinate Set, Coordinate Map, Heap, Priority Queue, Max Priority Queue, Min Priority Queue, Trie
14
+
15
+
16
+ # How
17
+
18
+ ## Live Examples
19
+
20
+ [Live Examples](https://data-structure-typed-examples.vercel.app)
21
+
22
+ <a href="https://data-structure-typed-examples.vercel.app" target="_blank">Live Examples</a>
3
23
 
4
24
  ## install
5
25
 
@@ -15,19 +35,368 @@ yarn add data-structure-typed
15
35
  npm install data-structure-typed
16
36
  ```
17
37
 
18
- ## Live Examples
38
+ ### Binary Search Tree (BST) snippet
19
39
 
20
- [//]: # ([Live Examples]&#40;https://data-structure-typed-examples.vercel.app&#41;)
40
+ ```typescript
41
+ import {BST, BSTNode} from 'data-structure-typed';
21
42
 
22
- <a href="https://data-structure-typed-examples.vercel.app" target="_blank">Live Examples</a>
43
+ const tree = new BST();
44
+ expect(tree).toBeInstanceOf(BST);
23
45
 
24
- ## Data Structures
46
+ const ids = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
47
+ tree.addMany(ids);
48
+ expect(tree.root).toBeInstanceOf(BSTNode);
49
+ if (tree.root) expect(tree.root.id).toBe(11);
50
+ expect(tree.count).toBe(16);
51
+ expect(tree.has(6)).toBe(true);
25
52
 
26
- Meticulously crafted to empower developers with a versatile set of essential data structures. Our library includes a
27
- wide range of data structures:
28
- Binary Tree, Binary Search Tree (BST), AVL Tree, Tree Multiset, Segment Tree, Binary Indexed Tree, Graph, Directed
29
- Graph, Undirected Graph, Linked List, Singly Linked List, Doubly Linked List, Queue, Object Deque, Array Deque, Stack,
30
- Hash, Coordinate Set, Coordinate Map, Heap, Priority Queue, Max Priority Queue, Min Priority Queue, Trie
53
+ const node6 = tree.get(6);
54
+ expect(node6 && tree.getHeight(node6)).toBe(2);
55
+ expect(node6 && tree.getDepth(node6)).toBe(3);
56
+
57
+ const nodeId10 = tree.get(10, 'id');
58
+ expect(nodeId10?.id).toBe(10);
59
+
60
+ const nodeVal9 = tree.get(9, 'val');
61
+ expect(nodeVal9?.id).toBe(9);
62
+
63
+ const nodesByCount1 = tree.getNodes(1, 'count');
64
+ expect(nodesByCount1.length).toBe(16);
65
+
66
+ const leftMost = tree.getLeftMost();
67
+ expect(leftMost?.id).toBe(1);
68
+
69
+ const node15 = tree.get(15);
70
+ const minNodeBySpecificNode = node15 && tree.getLeftMost(node15);
71
+ expect(minNodeBySpecificNode?.id).toBe(12);
72
+
73
+ const subTreeSum = node15 && tree.subTreeSum(node15);
74
+ expect(subTreeSum).toBe(70);
75
+
76
+ const lesserSum = tree.lesserSum(10);
77
+ expect(lesserSum).toBe(45);
78
+
79
+ expect(node15).toBeInstanceOf(BSTNode);
80
+ if (node15 instanceof BSTNode) {
81
+ const subTreeAdd = tree.subTreeAdd(node15, 1, 'count');
82
+ expect(subTreeAdd).toBeDefined();
83
+ }
84
+
85
+ const node11 = tree.get(11);
86
+ expect(node11).toBeInstanceOf(BSTNode);
87
+ if (node11 instanceof BSTNode) {
88
+ const allGreaterNodesAdded = tree.allGreaterNodesAdd(node11, 2, 'count');
89
+ expect(allGreaterNodesAdded).toBeDefined();
90
+ }
91
+
92
+ const dfsInorderNodes = tree.DFS('in', 'node');
93
+ expect(dfsInorderNodes[0].id).toBe(1);
94
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].id).toBe(16);
95
+
96
+ tree.balance();
97
+ expect(tree.isBalanced()).toBe(true);
98
+
99
+ const bfsNodesAfterBalanced = tree.BFS('node');
100
+ expect(bfsNodesAfterBalanced[0].id).toBe(8);
101
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].id).toBe(16);
102
+
103
+ const removed11 = tree.remove(11, true);
104
+ expect(removed11).toBeInstanceOf(Array);
105
+ expect(removed11[0]).toBeDefined();
106
+ expect(removed11[0].deleted).toBeDefined();
107
+
108
+ if (removed11[0].deleted) expect(removed11[0].deleted.id).toBe(11);
109
+
110
+ expect(tree.isAVLBalanced()).toBe(true);
111
+
112
+ expect(node15 && tree.getHeight(node15)).toBe(2);
113
+
114
+ const removed1 = tree.remove(1, true);
115
+ expect(removed1).toBeInstanceOf(Array);
116
+ expect(removed1[0]).toBeDefined();
117
+ expect(removed1[0].deleted).toBeDefined();
118
+ if (removed1[0].deleted) expect(removed1[0].deleted.id).toBe(1);
119
+
120
+ expect(tree.isAVLBalanced()).toBe(true);
121
+
122
+ expect(tree.getHeight()).toBe(4);
123
+
124
+ // The code for removing these nodes (4, 10, 15, 5, 13, 3, 8, 6, 7, 9, 14) in sequence has been omitted.
125
+
126
+ expect(tree.isAVLBalanced()).toBe(false);
127
+
128
+ const bfsIDs = tree.BFS();
129
+ expect(bfsIDs[0]).toBe(2);
130
+ expect(bfsIDs[1]).toBe(12);
131
+ expect(bfsIDs[2]).toBe(16);
132
+
133
+ const bfsNodes = tree.BFS('node');
134
+ expect(bfsNodes[0].id).toBe(2);
135
+ expect(bfsNodes[1].id).toBe(12);
136
+ expect(bfsNodes[2].id).toBe(16);
137
+ ```
138
+
139
+ ### Directed Graph simple snippet
140
+
141
+ ```typescript
142
+ import {DirectedGraph, DirectedVertex, DirectedEdge, VertexId} from 'data-structure-typed';
143
+
144
+ let graph: DirectedGraph<DirectedVertex, DirectedEdge>;
145
+
146
+ beforeEach(() => {
147
+ graph = new DirectedGraph();
148
+ });
149
+
150
+
151
+ it('should add vertices', () => {
152
+ const vertex1 = new DirectedVertex('A');
153
+ const vertex2 = new DirectedVertex('B');
154
+
155
+ graph.addVertex(vertex1);
156
+ graph.addVertex(vertex2);
157
+
158
+ expect(graph.hasVertex(vertex1)).toBe(true);
159
+ expect(graph.hasVertex(vertex2)).toBe(true);
160
+ });
161
+
162
+ it('should add edges', () => {
163
+ const vertex1 = new DirectedVertex('A');
164
+ const vertex2 = new DirectedVertex('B');
165
+ const edge = new DirectedEdge('A', 'B');
166
+
167
+ graph.addVertex(vertex1);
168
+ graph.addVertex(vertex2);
169
+ graph.addEdge(edge);
170
+
171
+ expect(graph.hasEdge('A', 'B')).toBe(true);
172
+ expect(graph.hasEdge('B', 'A')).toBe(false);
173
+ });
174
+
175
+ it('should remove edges', () => {
176
+ const vertex1 = new DirectedVertex('A');
177
+ const vertex2 = new DirectedVertex('B');
178
+ const edge = new DirectedEdge('A', 'B');
179
+
180
+ graph.addVertex(vertex1);
181
+ graph.addVertex(vertex2);
182
+ graph.addEdge(edge);
183
+
184
+ expect(graph.removeEdge(edge)).toBe(edge);
185
+ expect(graph.hasEdge('A', 'B')).toBe(false);
186
+ });
187
+
188
+ it('should perform topological sort', () => {
189
+ const vertexA = new DirectedVertex('A');
190
+ const vertexB = new DirectedVertex('B');
191
+ const vertexC = new DirectedVertex('C');
192
+ const edgeAB = new DirectedEdge('A', 'B');
193
+ const edgeBC = new DirectedEdge('B', 'C');
194
+
195
+ graph.addVertex(vertexA);
196
+ graph.addVertex(vertexB);
197
+ graph.addVertex(vertexC);
198
+ graph.addEdge(edgeAB);
199
+ graph.addEdge(edgeBC);
200
+
201
+ const topologicalOrder = graph.topologicalSort();
202
+ if (topologicalOrder) expect(topologicalOrder.map(v => v.id)).toEqual(['A', 'B', 'C']);
203
+ });
204
+ ```
205
+
206
+ ### Directed Graph complex snippet
207
+
208
+ ```typescript
209
+ import {DirectedGraph, DirectedVertex, DirectedEdge, VertexId} from 'data-structure-typed';
210
+
211
+ class MyVertex extends DirectedVertex {
212
+ private _data: string;
213
+ get data(): string {
214
+ return this._data;
215
+ }
216
+ set data(value: string) {
217
+ this._data = value;
218
+ }
219
+
220
+ constructor(id: VertexId, data: string) {
221
+ super(id);
222
+ this._data = data;
223
+ }
224
+ }
225
+
226
+ class MyEdge extends DirectedEdge {
227
+ private _data: string;
228
+ get data(): string {
229
+ return this._data;
230
+ }
231
+ set data(value: string) {
232
+ this._data = value;
233
+ }
234
+
235
+ constructor(v1: VertexId, v2: VertexId, weight: number, data: string) {
236
+ super(v1, v2, weight);
237
+ this._data = data;
238
+ }
239
+ }
240
+
241
+ describe('DirectedGraph Test3', () => {
242
+ const myGraph = new DirectedGraph<MyVertex, MyEdge>();
243
+
244
+ it('should test graph operations', () => {
245
+ const vertex1 = new MyVertex(1, 'data1');
246
+ const vertex2 = new MyVertex(2, 'data2');
247
+ const vertex3 = new MyVertex(3, 'data3');
248
+ const vertex4 = new MyVertex(4, 'data4');
249
+ const vertex5 = new MyVertex(5, 'data5');
250
+ const vertex6 = new MyVertex(6, 'data6');
251
+ const vertex7 = new MyVertex(7, 'data7');
252
+ const vertex8 = new MyVertex(8, 'data8');
253
+ const vertex9 = new MyVertex(9, 'data9');
254
+ myGraph.addVertex(vertex1);
255
+ myGraph.addVertex(vertex2);
256
+ myGraph.addVertex(vertex3);
257
+ myGraph.addVertex(vertex4);
258
+ myGraph.addVertex(vertex5);
259
+ myGraph.addVertex(vertex6);
260
+ myGraph.addVertex(vertex7);
261
+ myGraph.addVertex(vertex8);
262
+ myGraph.addVertex(vertex9);
263
+
264
+ myGraph.addEdge(new MyEdge(1, 2, 10, 'edge-data1-2'));
265
+ myGraph.addEdge(new MyEdge(2, 1, 20, 'edge-data2-1'));
266
+
267
+ expect(myGraph.getEdge(1, 2)).toBeTruthy();
268
+ expect(myGraph.getEdge(2, 1)).toBeTruthy();
269
+ expect(myGraph.getEdge(1, '100')).toBeFalsy();
270
+
271
+ myGraph.removeEdgeBetween(1, 2);
272
+ expect(myGraph.getEdge(1, 2)).toBeFalsy();
273
+
274
+ myGraph.addEdge(new MyEdge(3, 1, 3, 'edge-data-3-1'));
275
+ myGraph.addEdge(new MyEdge(1, 9, 19, 'edge-data1-9'));
276
+ myGraph.addEdge(new MyEdge(9, 7, 97, 'edge-data9-7'));
277
+ myGraph.addEdge(new MyEdge(7, 9, 79, 'edge-data7-9'));
278
+ myGraph.addEdge(new MyEdge(1, 4, 14, 'edge-data1-4'));
279
+ myGraph.addEdge(new MyEdge(4, 7, 47, 'edge-data4-7'));
280
+ myGraph.addEdge(new MyEdge(1, 2, 12, 'edge-data1-2'));
281
+ myGraph.addEdge(new MyEdge(2, 3, 23, 'edge-data2-3'));
282
+ myGraph.addEdge(new MyEdge(3, 5, 35, 'edge-data3-5'));
283
+ myGraph.addEdge(new MyEdge(5, 7, 57, 'edge-data5-7'));
284
+ myGraph.addEdge(new MyEdge(7, 3, 73, 'edge-data7-3'));
285
+
286
+ const topologicalSorted = myGraph.topologicalSort();
287
+ expect(topologicalSorted).toBeNull();
288
+
289
+ const minPath1to7 = myGraph.getMinPathBetween(1, 7);
290
+ expect(minPath1to7).toBeInstanceOf(Array);
291
+ if (minPath1to7 && minPath1to7.length > 0) {
292
+ expect(minPath1to7).toHaveLength(3);
293
+ expect(minPath1to7[0]).toBeInstanceOf(MyVertex);
294
+ expect(minPath1to7[0].id).toBe(1);
295
+ expect(minPath1to7[1].id).toBe(9);
296
+ expect(minPath1to7[2].id).toBe(7);
297
+ }
298
+
299
+ const fordResult1 = myGraph.bellmanFord(1);
300
+ expect(fordResult1).toBeTruthy();
301
+ expect(fordResult1.hasNegativeCycle).toBeUndefined();
302
+ const {distMap, preMap, paths, min, minPath} = fordResult1;
303
+ expect(distMap).toBeInstanceOf(Map);
304
+ expect(distMap.size).toBe(9);
305
+ expect(distMap.get(vertex1)).toBe(0);
306
+ expect(distMap.get(vertex2)).toBe(12);
307
+ expect(distMap.get(vertex3)).toBe(35);
308
+ expect(distMap.get(vertex4)).toBe(14);
309
+ expect(distMap.get(vertex5)).toBe(70);
310
+ expect(distMap.get(vertex6)).toBe(Infinity);
311
+ expect(distMap.get(vertex7)).toBe(61);
312
+ expect(distMap.get(vertex8)).toBe(Infinity);
313
+ expect(distMap.get(vertex9)).toBe(19);
314
+
315
+ expect(preMap).toBeInstanceOf(Map);
316
+ expect(preMap.size).toBe(0);
317
+
318
+ expect(paths).toBeInstanceOf(Array);
319
+ expect(paths.length).toBe(0);
320
+ expect(min).toBe(Infinity);
321
+ expect(minPath).toBeInstanceOf(Array);
322
+
323
+ const floydResult = myGraph.floyd();
324
+ expect(floydResult).toBeTruthy();
325
+ if (floydResult) {
326
+ const {costs, predecessor} = floydResult;
327
+ expect(costs).toBeInstanceOf(Array);
328
+ expect(costs.length).toBe(9);
329
+ expect(costs[0]).toEqual([32, 12, 35, 14, 70, Infinity, 61, Infinity, 19]);
330
+ expect(costs[1]).toEqual([20, 32, 23, 34, 58, Infinity, 81, Infinity, 39]);
331
+ expect(costs[2]).toEqual([3, 15, 38, 17, 35, Infinity, 64, Infinity, 22]);
332
+ expect(costs[3]).toEqual([123, 135, 120, 137, 155, Infinity, 47, Infinity, 126]);
333
+ expect(costs[4]).toEqual([133, 145, 130, 147, 165, Infinity, 57, Infinity, 136]);
334
+ expect(costs[5]).toEqual([Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity]);
335
+ expect(costs[6]).toEqual([76, 88, 73, 90, 108, Infinity, 137, Infinity, 79]);
336
+ expect(costs[7]).toEqual([Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity]);
337
+ expect(costs[8]).toEqual([173, 185, 170, 187, 205, Infinity, 97, Infinity, 176]);
338
+
339
+ expect(predecessor).toBeInstanceOf(Array);
340
+ expect(predecessor.length).toBe(9);
341
+ expect(predecessor[0]).toEqual([vertex2, null, vertex2, null, vertex3, null, vertex4, null, null]);
342
+ expect(predecessor[1]).toEqual([null, vertex1, null, vertex1, vertex3, null, vertex4, null, vertex1]);
343
+ expect(predecessor[5]).toEqual([null, null, null, null, null, null, null, null, null]);
344
+ expect(predecessor[7]).toEqual([null, null, null, null, null, null, null, null, null]);
345
+ expect(predecessor[8]).toEqual([vertex7, vertex7, vertex7, vertex7, vertex7, null, null, null, vertex7]);
346
+ }
347
+
348
+ const dijkstraRes12tt = myGraph.dijkstra(1, 2, true, true);
349
+ expect(dijkstraRes12tt).toBeTruthy();
350
+ if (dijkstraRes12tt) {
351
+ const {distMap, minDist, minPath, paths, preMap, seen} = dijkstraRes12tt;
352
+ expect(distMap).toBeInstanceOf(Map);
353
+ expect(distMap.size).toBe(9);
354
+ expect(distMap.get(vertex1)).toBe(0);
355
+ expect(distMap.get(vertex2)).toBe(12);
356
+ expect(distMap.get(vertex3)).toBe(Infinity);
357
+ expect(distMap.get(vertex4)).toBe(14);
358
+ expect(distMap.get(vertex5)).toBe(Infinity);
359
+ expect(distMap.get(vertex6)).toBe(Infinity);
360
+ expect(distMap.get(vertex7)).toBe(Infinity);
361
+ expect(distMap.get(vertex8)).toBe(Infinity);
362
+ expect(distMap.get(vertex9)).toBe(19);
363
+
364
+ expect(minDist).toBe(12);
365
+ expect(minPath).toBeInstanceOf(Array);
366
+ expect(minPath.length).toBe(2);
367
+ expect(minPath[0]).toBe(vertex1);
368
+ expect(minPath[1]).toBe(vertex2);
369
+
370
+ expect(paths).toBeInstanceOf(Array);
371
+ expect(paths.length).toBe(9);
372
+ expect(paths[0]).toBeInstanceOf(Array);
373
+ expect(paths[0][0]).toBe(vertex1);
374
+
375
+ expect(paths[1]).toBeInstanceOf(Array);
376
+ expect(paths[1][0]).toBe(vertex1);
377
+ expect(paths[1][1]).toBe(vertex2);
378
+
379
+ expect(paths[2]).toBeInstanceOf(Array);
380
+ expect(paths[2][0]).toBe(vertex3);
381
+ expect(paths[3]).toBeInstanceOf(Array);
382
+ expect(paths[3][0]).toBe(vertex1);
383
+ expect(paths[3][1]).toBe(vertex4);
384
+ expect(paths[4]).toBeInstanceOf(Array);
385
+ expect(paths[4][0]).toBe(vertex5);
386
+
387
+ expect(paths[5]).toBeInstanceOf(Array);
388
+ expect(paths[5][0]).toBe(vertex6);
389
+ expect(paths[6]).toBeInstanceOf(Array);
390
+ expect(paths[6][0]).toBe(vertex7);
391
+ expect(paths[7]).toBeInstanceOf(Array);
392
+ expect(paths[7][0]).toBe(vertex8);
393
+ expect(paths[8]).toBeInstanceOf(Array);
394
+ expect(paths[8][0]).toBe(vertex1);
395
+ expect(paths[8][1]).toBe(vertex9);
396
+ }
397
+ });
398
+ });
399
+ ```
31
400
 
32
401
  ## API docs
33
402
 
@@ -99,6 +468,7 @@ Hash, Coordinate Set, Coordinate Map, Heap, Priority Queue, Max Priority Queue,
99
468
 
100
469
  <a href="https://github.com/zrwusa/data-structure-typed-examples" target="_blank">Examples Repository</a>
101
470
 
471
+ # Why
102
472
 
103
473
  ## Complexities
104
474
 
@@ -363,40 +733,41 @@ Hash, Coordinate Set, Coordinate Map, Heap, Priority Queue, Max Priority Queue,
363
733
  </tbody>
364
734
  </table>
365
735
 
736
+ ![overview diagram](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/assets/overview-diagram-of-data-structures.png)
366
737
 
367
- ![complexities](src/assets/complexities-diff.jpg)
738
+ ![complexities](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/assets/complexities-diff.jpg)
368
739
 
369
- ![complexities of data structures](src/assets/data-structure-complexities.jpg)
740
+ ![complexities of data structures](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/assets/data-structure-complexities.jpg)
370
741
 
371
- ![](src/data-structures/binary-tree/diagrams/bst-rotation.gif)
742
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/binary-tree/bst-rotation.gif)
372
743
 
373
- ![](src/data-structures/binary-tree/diagrams/avl-tree-inserting.gif)
744
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/binary-tree/avl-tree-inserting.gif)
374
745
 
375
- ![](src/data-structures/graph/diagrams/tarjan.webp)
746
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/tarjan.webp)
376
747
 
377
- ![](src/data-structures/graph/diagrams/adjacency-list.jpg)
748
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/adjacency-list.jpg)
378
749
 
379
- ![](src/data-structures/graph/diagrams/adjacency-list-pros-cons.jpg)
750
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/adjacency-list-pros-cons.jpg)
380
751
 
381
- ![](src/data-structures/graph/diagrams/adjacency-matrix.jpg)
752
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/adjacency-matrix.jpg)
382
753
 
383
- ![](src/data-structures/graph/diagrams/adjacency-matrix-pros-cons.jpg)
754
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/adjacency-matrix-pros-cons.jpg)
384
755
 
385
- ![](src/data-structures/graph/diagrams/dfs-can-do.jpg)
756
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/dfs-can-do.jpg)
386
757
 
387
- ![](src/data-structures/graph/diagrams/edge-list.jpg)
758
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/edge-list.jpg)
388
759
 
389
- ![](src/data-structures/graph/diagrams/edge-list-pros-cons.jpg)
760
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/edge-list-pros-cons.jpg)
390
761
 
391
- ![](src/data-structures/graph/diagrams/max-flow.jpg)
762
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/max-flow.jpg)
392
763
 
393
- ![](src/data-structures/graph/diagrams/mst.jpg)
764
+ ![](https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/mst.jpg)
394
765
 
395
- [//]: # (![]&#40;src/data-structures/graph/diagrams/tarjan-articulation-point-bridge.png&#41;)
766
+ [//]: # (![]&#40;https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/tarjan-articulation-point-bridge.png&#41;)
396
767
 
397
- [//]: # (![]&#40;src/data-structures/graph/diagrams/tarjan-complicate-simple.png&#41;)
768
+ [//]: # (![]&#40;https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/tarjan-complicate-simple.png&#41;)
398
769
 
399
- [//]: # (![]&#40;src/data-structures/graph/diagrams/tarjan-strongly-connected-component.png&#41;)
770
+ [//]: # (![]&#40;https://github.com/zrwusa/assets/blob/master/images/data-structure-typed/graph/tarjan-strongly-connected-component.png&#41;)
400
771
 
401
772
 
402
773
 
@@ -22,63 +22,63 @@ export declare enum LoopType {
22
22
  recursive = 2
23
23
  }
24
24
  export declare class BinaryTreeNode<T> {
25
+ constructor(id: BinaryTreeNodeId, val: T, count?: number);
25
26
  protected _id: BinaryTreeNodeId;
26
27
  get id(): BinaryTreeNodeId;
28
+ set id(v: BinaryTreeNodeId);
29
+ protected _val: T;
30
+ get val(): T;
31
+ set val(v: T);
32
+ protected _left?: BinaryTreeNode<T> | null;
33
+ get left(): BinaryTreeNode<T> | null | undefined;
34
+ set left(v: BinaryTreeNode<T> | null | undefined);
35
+ protected _right?: BinaryTreeNode<T> | null;
36
+ get right(): BinaryTreeNode<T> | null | undefined;
37
+ set right(v: BinaryTreeNode<T> | null | undefined);
38
+ protected _parent: BinaryTreeNode<T> | null | undefined;
39
+ get parent(): BinaryTreeNode<T> | null | undefined;
40
+ set parent(v: BinaryTreeNode<T> | null | undefined);
41
+ protected _familyPosition: FamilyPosition;
42
+ get familyPosition(): FamilyPosition;
43
+ set familyPosition(v: FamilyPosition);
44
+ protected _count: number;
45
+ get count(): number;
46
+ set count(v: number);
47
+ protected _height: number;
48
+ get height(): number;
49
+ set height(v: number);
27
50
  /**
28
51
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
29
52
  */
30
53
  getId(): BinaryTreeNodeId;
31
- set id(v: BinaryTreeNodeId);
32
- protected _val: T;
33
- get val(): T;
34
54
  /**
35
55
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
36
56
  */
37
57
  getVal(): T;
38
- set val(v: T);
39
- protected _left?: BinaryTreeNode<T> | null;
40
- get left(): BinaryTreeNode<T> | null | undefined;
41
58
  /**
42
59
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
43
60
  */
44
61
  getLeft(): BinaryTreeNode<T> | null | undefined;
45
- set left(v: BinaryTreeNode<T> | null | undefined);
46
- protected _right?: BinaryTreeNode<T> | null;
47
- get right(): BinaryTreeNode<T> | null | undefined;
48
62
  /**
49
63
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
50
64
  */
51
65
  getRight(): BinaryTreeNode<T> | null | undefined;
52
- set right(v: BinaryTreeNode<T> | null | undefined);
53
- protected _parent: BinaryTreeNode<T> | null | undefined;
54
- get parent(): BinaryTreeNode<T> | null | undefined;
55
66
  /**
56
67
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
57
68
  */
58
69
  getParent(): BinaryTreeNode<T> | null | undefined;
59
- set parent(v: BinaryTreeNode<T> | null | undefined);
60
- protected _familyPosition: FamilyPosition;
61
- get familyPosition(): FamilyPosition;
62
70
  /**
63
71
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
64
72
  */
65
73
  getFamilyPosition(): FamilyPosition;
66
- set familyPosition(v: FamilyPosition);
67
- protected _count: number;
68
- get count(): number;
69
74
  /**
70
75
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
71
76
  */
72
77
  getCount(): number;
73
- set count(v: number);
74
- protected _height: number;
75
- get height(): number;
76
78
  /**
77
79
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
78
80
  */
79
81
  getHeight(): number;
80
- set height(v: number);
81
- constructor(id: BinaryTreeNodeId, val: T, count?: number);
82
82
  swapLocation(swapNode: BinaryTreeNode<T>): BinaryTreeNode<T>;
83
83
  clone(): BinaryTreeNode<T>;
84
84
  }
@@ -104,26 +104,26 @@ export declare class BinaryTree<T> {
104
104
  });
105
105
  protected _root: BinaryTreeNode<T> | null;
106
106
  get root(): BinaryTreeNode<T> | null;
107
+ protected set root(v: BinaryTreeNode<T> | null);
108
+ protected _size: number;
109
+ get size(): number;
110
+ protected set size(v: number);
111
+ protected _count: number;
112
+ get count(): number;
113
+ protected set count(v: number);
107
114
  /**
108
115
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Getters (using the same name as the property) while utilizing separate method names for Setters.
109
116
  * @returns The method is returning either a BinaryTreeNode object of type T or null.
110
117
  */
111
118
  getRoot(): BinaryTreeNode<T> | null;
112
- protected set root(v: BinaryTreeNode<T> | null);
113
- protected _size: number;
114
- get size(): number;
115
119
  /**
116
120
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
117
121
  */
118
122
  getSize(): number;
119
- protected set size(v: number);
120
- protected _count: number;
121
- get count(): number;
122
123
  /**
123
124
  * Starting from TypeScript version 5.0 and onwards, the use of distinct access modifiers for Getters and Setters is not permitted. As an alternative, to ensure compatibility, it is necessary to adopt a Java-style approach for Setters (using the same name as the property) while utilizing separate method names for Getters.
124
125
  */
125
126
  getCount(): number;
126
- protected set count(v: number);
127
127
  /**
128
128
  * The function creates a new binary tree node with the given id, value, and count, or returns null if the value is
129
129
  * null.