data-structure-typed 1.15.1 → 1.15.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/README.md +378 -7
- package/dist/data-structures/binary-tree/binary-tree.d.ts +30 -30
- package/dist/data-structures/binary-tree/binary-tree.js +55 -55
- package/dist/data-structures/binary-tree/segment-tree.d.ts +17 -17
- package/dist/data-structures/binary-tree/segment-tree.js +30 -30
- package/dist/data-structures/graph/abstract-graph.d.ts +6 -6
- package/dist/data-structures/graph/abstract-graph.js +6 -6
- package/dist/data-structures/graph/directed-graph.d.ts +4 -4
- package/dist/data-structures/graph/directed-graph.js +6 -6
- package/dist/data-structures/graph/undirected-graph.d.ts +3 -3
- package/dist/data-structures/hash/coordinate-map.d.ts +2 -2
- package/dist/data-structures/hash/coordinate-set.d.ts +2 -2
- package/dist/data-structures/heap/heap.d.ts +14 -14
- package/dist/data-structures/heap/heap.js +12 -12
- package/dist/data-structures/linked-list/doubly-linked-list.d.ts +9 -9
- package/dist/data-structures/linked-list/doubly-linked-list.js +12 -12
- package/dist/data-structures/linked-list/singly-linked-list.d.ts +7 -7
- package/dist/data-structures/priority-queue/priority-queue.d.ts +7 -7
- package/dist/data-structures/priority-queue/priority-queue.js +6 -6
- package/dist/data-structures/queue/deque.d.ts +1 -1
- package/dist/utils/types/utils.d.ts +0 -3
- package/dist/utils/types/utils.js +0 -14
- package/dist/utils/utils.js +0 -197
- package/package.json +2 -4
- package/src/assets/overview-diagram-of-data-structures.png +0 -0
- package/src/data-structures/binary-tree/binary-tree.ts +83 -76
- package/src/data-structures/binary-tree/segment-tree.ts +55 -36
- package/src/data-structures/graph/abstract-graph.ts +21 -19
- package/src/data-structures/graph/directed-graph.ts +23 -18
- package/src/data-structures/graph/undirected-graph.ts +16 -11
- package/src/data-structures/hash/coordinate-map.ts +11 -8
- package/src/data-structures/hash/coordinate-set.ts +11 -8
- package/src/data-structures/heap/heap.ts +34 -28
- package/src/data-structures/linked-list/doubly-linked-list.ts +40 -26
- package/src/data-structures/linked-list/singly-linked-list.ts +32 -23
- package/src/data-structures/priority-queue/priority-queue.ts +17 -14
- package/src/data-structures/queue/deque.ts +14 -4
- package/src/utils/types/utils.ts +1 -173
- package/src/utils/utils.ts +0 -212
- package/tests/unit/data-structures/binary-tree/bst.test.ts +40 -31
- package/tests/unit/data-structures/graph/directed-graph.test.ts +31 -34
package/src/utils/utils.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// import _ from 'lodash';
|
|
2
|
-
// import type {AnyFunction, CaseType, JSONObject, JSONSerializable} from './types';
|
|
3
|
-
|
|
4
1
|
export const uuidV4 = function () {
|
|
5
2
|
return 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, function (c) {
|
|
6
3
|
const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
@@ -8,215 +5,6 @@ export const uuidV4 = function () {
|
|
|
8
5
|
});
|
|
9
6
|
};
|
|
10
7
|
|
|
11
|
-
// export const isObject = (object: string | JSONObject | boolean | AnyFunction | number) => object != null && typeof object === 'object';
|
|
12
|
-
|
|
13
|
-
// export const deepObjectStrictEqual = (object1: JSONSerializable, object2: JSONSerializable) => {
|
|
14
|
-
// const keys1 = Object.keys(object1);
|
|
15
|
-
// const keys2 = Object.keys(object2);
|
|
16
|
-
// if (keys1.length !== keys2.length) {
|
|
17
|
-
// return false;
|
|
18
|
-
// }
|
|
19
|
-
// for (const key of keys1) {
|
|
20
|
-
// const val1 = object1[key];
|
|
21
|
-
// const val2 = object2[key];
|
|
22
|
-
// const areObjects = isObject(val1) && isObject(val2);
|
|
23
|
-
// if (
|
|
24
|
-
// areObjects && !deepObjectStrictEqual(val1, val2) ||
|
|
25
|
-
// !areObjects && val1 !== val2
|
|
26
|
-
// ) {
|
|
27
|
-
// return false;
|
|
28
|
-
// }
|
|
29
|
-
// }
|
|
30
|
-
// return true;
|
|
31
|
-
// };
|
|
32
|
-
|
|
33
|
-
// export class StringUtil {
|
|
34
|
-
// // camelCase
|
|
35
|
-
// static toCamelCase(str: string) {
|
|
36
|
-
// return _.camelCase(str);
|
|
37
|
-
// }
|
|
38
|
-
//
|
|
39
|
-
// // snake_case
|
|
40
|
-
// static toSnakeCase(str: string) {
|
|
41
|
-
// return _.snakeCase(str);
|
|
42
|
-
// }
|
|
43
|
-
//
|
|
44
|
-
// // PascalCase
|
|
45
|
-
// static toPascalCase(str: string) {
|
|
46
|
-
// return _.startCase(_.camelCase(str)).replace(/ /g, '');
|
|
47
|
-
// }
|
|
48
|
-
//
|
|
49
|
-
// // CONSTANT_CASE
|
|
50
|
-
// static toConstantCase(str: string) {
|
|
51
|
-
// return _.upperCase(str).replace(/ /g, '_');
|
|
52
|
-
// }
|
|
53
|
-
//
|
|
54
|
-
// // kebab-case
|
|
55
|
-
// static toKebabCase(str: string) {
|
|
56
|
-
// return _.kebabCase(str);
|
|
57
|
-
// }
|
|
58
|
-
//
|
|
59
|
-
// // lowercase
|
|
60
|
-
// static toLowerCase(str: string) {
|
|
61
|
-
// return _.lowerCase(str).replace(/ /g, '');
|
|
62
|
-
// }
|
|
63
|
-
//
|
|
64
|
-
// // Title Case
|
|
65
|
-
// static toTitleCase(str: string) {
|
|
66
|
-
// return _.startCase(_.camelCase(str));
|
|
67
|
-
// }
|
|
68
|
-
//
|
|
69
|
-
// // Sentence case
|
|
70
|
-
// static toSentenceCase(str: string) {
|
|
71
|
-
// return _.upperFirst(_.lowerCase(str));
|
|
72
|
-
// }
|
|
73
|
-
//
|
|
74
|
-
// // path/case
|
|
75
|
-
// static toPathCase(str: string) {
|
|
76
|
-
// return _.lowerCase(str).replace(/ /g, '/');
|
|
77
|
-
// }
|
|
78
|
-
//
|
|
79
|
-
// // dot.case
|
|
80
|
-
// static toDotCase(str: string) {
|
|
81
|
-
// return _.lowerCase(str).replace(/ /g, '.');
|
|
82
|
-
// }
|
|
83
|
-
// }
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
// export const deepKeysConvert = (obj: any, toType?: CaseType): any => {
|
|
87
|
-
// const _toType = toType || 'snake';
|
|
88
|
-
// if (Array.isArray(obj)) {
|
|
89
|
-
// return obj.map(v => deepKeysConvert(v, _toType));
|
|
90
|
-
// } else if (obj !== null && obj.constructor === Object) {
|
|
91
|
-
// return Object.keys(obj).reduce(
|
|
92
|
-
// (result, key) => {
|
|
93
|
-
// let newKey = '';
|
|
94
|
-
// switch (_toType) {
|
|
95
|
-
// case 'camel':
|
|
96
|
-
// newKey = StringUtil.toCamelCase(key);
|
|
97
|
-
// break;
|
|
98
|
-
// case 'snake':
|
|
99
|
-
// newKey = StringUtil.toSnakeCase(key);
|
|
100
|
-
// break;
|
|
101
|
-
// case 'pascal':
|
|
102
|
-
// newKey = StringUtil.toPascalCase(key);
|
|
103
|
-
// break;
|
|
104
|
-
// case 'constant':
|
|
105
|
-
// newKey = StringUtil.toConstantCase(key);
|
|
106
|
-
// break;
|
|
107
|
-
// case 'kebab':
|
|
108
|
-
// newKey = StringUtil.toKebabCase(key);
|
|
109
|
-
// break;
|
|
110
|
-
// case 'lower':
|
|
111
|
-
// newKey = StringUtil.toLowerCase(key);
|
|
112
|
-
// break;
|
|
113
|
-
// case 'title':
|
|
114
|
-
// newKey = StringUtil.toTitleCase(key);
|
|
115
|
-
// break;
|
|
116
|
-
// case 'sentence':
|
|
117
|
-
// newKey = StringUtil.toSentenceCase(key);
|
|
118
|
-
// break;
|
|
119
|
-
// case 'path':
|
|
120
|
-
// newKey = StringUtil.toPathCase(key);
|
|
121
|
-
// break;
|
|
122
|
-
// case 'dot':
|
|
123
|
-
// newKey = StringUtil.toDotCase(key);
|
|
124
|
-
// break;
|
|
125
|
-
// default:
|
|
126
|
-
// newKey = StringUtil.toDotCase(key);
|
|
127
|
-
// break;
|
|
128
|
-
// }
|
|
129
|
-
// return {
|
|
130
|
-
// ...result,
|
|
131
|
-
// [newKey]: deepKeysConvert(obj[key], _toType),
|
|
132
|
-
// };
|
|
133
|
-
// },
|
|
134
|
-
// {},
|
|
135
|
-
// );
|
|
136
|
-
// }
|
|
137
|
-
// return obj;
|
|
138
|
-
// };
|
|
139
|
-
|
|
140
|
-
// export const deepRemoveByKey = (obj: any, keysToBeRemoved: string[]) => {
|
|
141
|
-
// const result = _.transform(obj, function (result: JSONSerializable, value: any, key: string) {
|
|
142
|
-
// if (_.isObject(value)) {
|
|
143
|
-
// value = deepRemoveByKey(value, keysToBeRemoved);
|
|
144
|
-
// }
|
|
145
|
-
// if (!keysToBeRemoved.includes(key)) {
|
|
146
|
-
// _.isArray(obj) ? result.push(value) : result[key] = value;
|
|
147
|
-
// }
|
|
148
|
-
// });
|
|
149
|
-
// return result as typeof obj;
|
|
150
|
-
// };
|
|
151
|
-
|
|
152
|
-
// export const deepRenameKeys = (obj: JSONSerializable, keysMap: { [key in string]: string }) => {
|
|
153
|
-
// return _.transform(obj, function (result: JSONSerializable, value: any, key: string | number) {
|
|
154
|
-
// const currentKey = keysMap[key] || key;
|
|
155
|
-
// result[currentKey] = _.isObject(value) ? deepRenameKeys(value, keysMap) : value;
|
|
156
|
-
// });
|
|
157
|
-
// };
|
|
158
|
-
|
|
159
|
-
// export const deepReplaceValues = (obj: JSONSerializable, keyReducerMap: { [key in string]: (item: JSONSerializable) => any }) => {
|
|
160
|
-
// const newObject = _.clone(obj) as JSONSerializable;
|
|
161
|
-
// _.each(obj, (val: any, key: string) => {
|
|
162
|
-
// for (const item in keyReducerMap) {
|
|
163
|
-
// if (key === item) {
|
|
164
|
-
// newObject[key] = keyReducerMap[item](newObject);
|
|
165
|
-
// } else if (typeof (val) === 'object' || val instanceof Array) {
|
|
166
|
-
// newObject[key] = deepReplaceValues(val, keyReducerMap);
|
|
167
|
-
// }
|
|
168
|
-
// }
|
|
169
|
-
// });
|
|
170
|
-
// return newObject;
|
|
171
|
-
// };
|
|
172
|
-
|
|
173
|
-
// TODO determine depth and pass root node as a param through callback
|
|
174
|
-
// export const deepAdd = (obj: JSONSerializable, keyReducerMap: { [key in string]: (item: JSONSerializable) => any }, isItemRootParent?: boolean) => {
|
|
175
|
-
// const newObject = _.clone(obj) as JSONObject | [];
|
|
176
|
-
// if (_.isObject(newObject) && !_.isArray(newObject)) {
|
|
177
|
-
// for (const item in keyReducerMap) {
|
|
178
|
-
// newObject[item] = keyReducerMap[item](newObject);
|
|
179
|
-
// }
|
|
180
|
-
// }
|
|
181
|
-
// _.each(obj, (val: any, key: string | number) => {
|
|
182
|
-
// if (_.isObject(val)) {
|
|
183
|
-
// for (const item in keyReducerMap) {
|
|
184
|
-
// // @ts-ignore
|
|
185
|
-
// newObject[key] = deepAdd(val, keyReducerMap, isItemRootParent);
|
|
186
|
-
// }
|
|
187
|
-
// }
|
|
188
|
-
// });
|
|
189
|
-
// return newObject;
|
|
190
|
-
// };
|
|
191
|
-
|
|
192
|
-
// const styleString = (color: string) => `color: ${color}; font-weight: bold`;
|
|
193
|
-
|
|
194
|
-
// const styleHeader = (header: string) => `%c[${header}]`;
|
|
195
|
-
|
|
196
|
-
// export const bunnyConsole = {
|
|
197
|
-
// log: (headerLog = 'bunny', ...args: any[]) => {
|
|
198
|
-
// return console.log(styleHeader(headerLog), styleString('black'), ...args);
|
|
199
|
-
// },
|
|
200
|
-
// warn: (headerLog = 'bunny', ...args: any[]) => {
|
|
201
|
-
// return console.warn(styleHeader(headerLog), styleString('orange'), ...args);
|
|
202
|
-
// },
|
|
203
|
-
// error: (headerLog = 'bunny', ...args: any[]) => {
|
|
204
|
-
// return console.error(styleHeader(headerLog), styleString('red'), ...args);
|
|
205
|
-
// }
|
|
206
|
-
// };
|
|
207
|
-
|
|
208
|
-
// export const timeStart = () => {
|
|
209
|
-
// return performance ? performance.now() : new Date().getTime();
|
|
210
|
-
// };
|
|
211
|
-
|
|
212
|
-
// export const timeEnd = (startTime: number, headerLog?: string, consoleConditionFn?: (timeSpent: number) => boolean) => {
|
|
213
|
-
// const timeSpent = (performance ? performance.now() : new Date().getTime()) - startTime;
|
|
214
|
-
// const isPassCondition = consoleConditionFn ? consoleConditionFn(timeSpent) : true;
|
|
215
|
-
// if (isPassCondition) {
|
|
216
|
-
// bunnyConsole.log(headerLog ? headerLog : 'time spent', timeSpent.toFixed(2));
|
|
217
|
-
// }
|
|
218
|
-
// };
|
|
219
|
-
|
|
220
8
|
export const arrayRemove = function <T>(array: T[], predicate: (item: T, index: number, array: T[]) => boolean): T[] {
|
|
221
9
|
let i = -1, len = array ? array.length : 0;
|
|
222
10
|
const result = [];
|
|
@@ -1,35 +1,40 @@
|
|
|
1
1
|
import {BST, BSTNode} from '../../../../src';
|
|
2
2
|
|
|
3
|
-
describe('
|
|
3
|
+
describe('BST Case6', () => {
|
|
4
4
|
it('should perform various operations on a Binary Search Tree', () => {
|
|
5
|
-
const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
6
5
|
|
|
7
6
|
const tree = new BST();
|
|
8
|
-
|
|
9
7
|
expect(tree).toBeInstanceOf(BST);
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
const values = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
10
|
+
tree.addMany(values);
|
|
13
11
|
expect(tree.root).toBeInstanceOf(BSTNode);
|
|
12
|
+
|
|
14
13
|
if (tree.root) expect(tree.root.id).toBe(11);
|
|
14
|
+
|
|
15
15
|
expect(tree.count).toBe(16);
|
|
16
|
+
|
|
16
17
|
expect(tree.has(6)).toBe(true);
|
|
17
18
|
|
|
18
19
|
const node6 = tree.get(6);
|
|
19
20
|
expect(node6 && tree.getHeight(node6)).toBe(2);
|
|
20
21
|
expect(node6 && tree.getDepth(node6)).toBe(3);
|
|
21
|
-
const getNodeById = tree.get(10, 'id');
|
|
22
|
-
expect(getNodeById?.id).toBe(10);
|
|
23
22
|
|
|
24
|
-
const
|
|
25
|
-
expect(
|
|
23
|
+
const nodeId10 = tree.get(10, 'id');
|
|
24
|
+
expect(nodeId10?.id).toBe(10);
|
|
25
|
+
|
|
26
|
+
const nodeVal9 = tree.get(9, 'val');
|
|
27
|
+
expect(nodeVal9?.id).toBe(9);
|
|
28
|
+
|
|
29
|
+
const nodesByCount1 = tree.getNodes(1, 'count');
|
|
30
|
+
expect(nodesByCount1.length).toBe(16);
|
|
26
31
|
|
|
27
|
-
const
|
|
28
|
-
expect(
|
|
32
|
+
const leftMost = tree.getLeftMost();
|
|
33
|
+
expect(leftMost?.id).toBe(1);
|
|
29
34
|
|
|
30
35
|
const node15 = tree.get(15);
|
|
31
|
-
const
|
|
32
|
-
expect(
|
|
36
|
+
const minNodeBySpecificNode = node15 && tree.getLeftMost(node15);
|
|
37
|
+
expect(minNodeBySpecificNode?.id).toBe(12);
|
|
33
38
|
|
|
34
39
|
const subTreeSum = node15 && tree.subTreeSum(node15);
|
|
35
40
|
expect(subTreeSum).toBe(70);
|
|
@@ -43,30 +48,33 @@ describe('bst-case6', () => {
|
|
|
43
48
|
expect(subTreeAdd).toBeDefined();
|
|
44
49
|
}
|
|
45
50
|
|
|
46
|
-
|
|
47
51
|
const node11 = tree.get(11);
|
|
48
52
|
expect(node11).toBeInstanceOf(BSTNode);
|
|
49
53
|
if (node11 instanceof BSTNode) {
|
|
50
|
-
const
|
|
51
|
-
expect(
|
|
54
|
+
const allGreaterNodesAdded = tree.allGreaterNodesAdd(node11, 2, 'count');
|
|
55
|
+
expect(allGreaterNodesAdded).toBeDefined();
|
|
52
56
|
}
|
|
53
57
|
|
|
54
|
-
const
|
|
55
|
-
expect(
|
|
56
|
-
expect(
|
|
58
|
+
const dfsInorderNodes = tree.DFS('in', 'node');
|
|
59
|
+
expect(dfsInorderNodes[0].id).toBe(1);
|
|
60
|
+
expect(dfsInorderNodes[dfsInorderNodes.length - 1].id).toBe(16);
|
|
57
61
|
|
|
58
62
|
tree.balance();
|
|
59
|
-
const bfs = tree.BFS('node');
|
|
60
63
|
expect(tree.isBalanced()).toBe(true);
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
|
|
65
|
+
const bfsNodesAfterBalanced = tree.BFS('node');
|
|
66
|
+
expect(bfsNodesAfterBalanced[0].id).toBe(8);
|
|
67
|
+
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].id).toBe(16);
|
|
63
68
|
|
|
64
69
|
const removed11 = tree.remove(11, true);
|
|
65
70
|
expect(removed11).toBeInstanceOf(Array);
|
|
66
71
|
expect(removed11[0]).toBeDefined();
|
|
67
72
|
expect(removed11[0].deleted).toBeDefined();
|
|
73
|
+
|
|
68
74
|
if (removed11[0].deleted) expect(removed11[0].deleted.id).toBe(11);
|
|
75
|
+
|
|
69
76
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
77
|
+
|
|
70
78
|
expect(node15 && tree.getHeight(node15)).toBe(2);
|
|
71
79
|
|
|
72
80
|
const removed1 = tree.remove(1, true);
|
|
@@ -76,6 +84,7 @@ describe('bst-case6', () => {
|
|
|
76
84
|
if (removed1[0].deleted) expect(removed1[0].deleted.id).toBe(1);
|
|
77
85
|
|
|
78
86
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
87
|
+
|
|
79
88
|
expect(tree.getHeight()).toBe(4);
|
|
80
89
|
|
|
81
90
|
const removed4 = tree.remove(4, true);
|
|
@@ -170,16 +179,16 @@ describe('bst-case6', () => {
|
|
|
170
179
|
expect(tree.getHeight()).toBe(2);
|
|
171
180
|
|
|
172
181
|
|
|
173
|
-
expect(
|
|
182
|
+
expect(tree.isAVLBalanced()).toBe(false);
|
|
174
183
|
|
|
175
|
-
const
|
|
176
|
-
expect(
|
|
177
|
-
expect(
|
|
178
|
-
expect(
|
|
184
|
+
const bfsIDs = tree.BFS();
|
|
185
|
+
expect(bfsIDs[0]).toBe(2);
|
|
186
|
+
expect(bfsIDs[1]).toBe(12);
|
|
187
|
+
expect(bfsIDs[2]).toBe(16);
|
|
179
188
|
|
|
180
|
-
const
|
|
181
|
-
expect(
|
|
182
|
-
expect(
|
|
183
|
-
expect(
|
|
189
|
+
const bfsNodes = tree.BFS('node');
|
|
190
|
+
expect(bfsNodes[0].id).toBe(2);
|
|
191
|
+
expect(bfsNodes[1].id).toBe(12);
|
|
192
|
+
expect(bfsNodes[2].id).toBe(16);
|
|
184
193
|
});
|
|
185
194
|
});
|
|
@@ -1,29 +1,5 @@
|
|
|
1
1
|
import {DirectedEdge, DirectedGraph, DirectedVertex, VertexId} from '../../../../src';
|
|
2
2
|
|
|
3
|
-
class MyVertex extends DirectedVertex {
|
|
4
|
-
data: string;
|
|
5
|
-
|
|
6
|
-
constructor(id: VertexId, data: string) {
|
|
7
|
-
super(id);
|
|
8
|
-
this.data = data;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
class MyEdge extends DirectedEdge {
|
|
13
|
-
data: string;
|
|
14
|
-
|
|
15
|
-
constructor(v1: VertexId, v2: VertexId, weight: number, data: string) {
|
|
16
|
-
super(v1, v2, weight);
|
|
17
|
-
this.data = data;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
class MyGraph<V extends MyVertex, E extends MyEdge> extends DirectedGraph<V, E> {
|
|
22
|
-
constructor() {
|
|
23
|
-
super();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
3
|
describe('DirectedGraph Test1', () => {
|
|
28
4
|
let graph: DirectedGraph<DirectedVertex, DirectedEdge>;
|
|
29
5
|
|
|
@@ -69,10 +45,7 @@ describe('DirectedGraph Test1', () => {
|
|
|
69
45
|
expect(graph.hasEdge('A', 'B')).toBe(false);
|
|
70
46
|
});
|
|
71
47
|
|
|
72
|
-
// Add more test cases for other methods...
|
|
73
|
-
|
|
74
48
|
it('should perform topological sort', () => {
|
|
75
|
-
// Create a graph with vertices and edges
|
|
76
49
|
const vertexA = new DirectedVertex('A');
|
|
77
50
|
const vertexB = new DirectedVertex('B');
|
|
78
51
|
const vertexC = new DirectedVertex('C');
|
|
@@ -85,17 +58,43 @@ describe('DirectedGraph Test1', () => {
|
|
|
85
58
|
graph.addEdge(edgeAB);
|
|
86
59
|
graph.addEdge(edgeBC);
|
|
87
60
|
|
|
88
|
-
// Perform topological sort
|
|
89
61
|
const topologicalOrder = graph.topologicalSort();
|
|
90
|
-
|
|
91
62
|
if (topologicalOrder) expect(topologicalOrder.map(v => v.id)).toEqual(['A', 'B', 'C']);
|
|
92
|
-
|
|
93
63
|
});
|
|
94
|
-
|
|
95
|
-
// Add more test cases for other methods...
|
|
96
64
|
});
|
|
97
65
|
|
|
98
66
|
|
|
67
|
+
class MyVertex extends DirectedVertex {
|
|
68
|
+
private _data: string;
|
|
69
|
+
get data(): string {
|
|
70
|
+
return this._data;
|
|
71
|
+
}
|
|
72
|
+
set data(value: string) {
|
|
73
|
+
this._data = value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
constructor(id: VertexId, data: string) {
|
|
77
|
+
super(id);
|
|
78
|
+
this._data = data;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
class MyEdge extends DirectedEdge {
|
|
83
|
+
private _data: string;
|
|
84
|
+
get data(): string {
|
|
85
|
+
return this._data;
|
|
86
|
+
}
|
|
87
|
+
set data(value: string) {
|
|
88
|
+
this._data = value;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
constructor(v1: VertexId, v2: VertexId, weight: number, data: string) {
|
|
92
|
+
super(v1, v2, weight);
|
|
93
|
+
this._data = data;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
99
98
|
describe('DirectedGraph Test2 operations', () => {
|
|
100
99
|
const myGraph = new DirectedGraph<MyVertex, MyEdge>();
|
|
101
100
|
|
|
@@ -223,8 +222,6 @@ describe('DirectedGraph Test3', () => {
|
|
|
223
222
|
expect(myGraph.getEdge(2, 1)).toBeTruthy();
|
|
224
223
|
expect(myGraph.getEdge(1, '100')).toBeFalsy();
|
|
225
224
|
|
|
226
|
-
// Add the rest of your assertions here...
|
|
227
|
-
|
|
228
225
|
myGraph.removeEdgeBetween(1, 2);
|
|
229
226
|
expect(myGraph.getEdge(1, 2)).toBeFalsy();
|
|
230
227
|
|