data-structure-typed 1.40.0 → 1.41.0

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 (29) hide show
  1. package/CHANGELOG.md +2 -1
  2. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +8 -0
  3. package/dist/cjs/data-structures/binary-tree/binary-tree.js +22 -2
  4. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  5. package/dist/cjs/data-structures/binary-tree/bst.d.ts +1 -1
  6. package/dist/cjs/data-structures/binary-tree/bst.js +1 -1
  7. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +95 -9
  9. package/dist/cjs/data-structures/binary-tree/rb-tree.js +379 -12
  10. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  11. package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -7
  12. package/dist/cjs/types/data-structures/binary-tree/rb-tree.js +11 -6
  13. package/dist/cjs/types/data-structures/binary-tree/rb-tree.js.map +1 -1
  14. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +8 -0
  15. package/dist/mjs/data-structures/binary-tree/binary-tree.js +22 -2
  16. package/dist/mjs/data-structures/binary-tree/bst.d.ts +1 -1
  17. package/dist/mjs/data-structures/binary-tree/bst.js +1 -1
  18. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +95 -9
  19. package/dist/mjs/data-structures/binary-tree/rb-tree.js +384 -13
  20. package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -7
  21. package/dist/mjs/types/data-structures/binary-tree/rb-tree.js +11 -6
  22. package/dist/umd/data-structure-typed.min.js +1 -1
  23. package/dist/umd/data-structure-typed.min.js.map +1 -1
  24. package/package.json +5 -5
  25. package/src/data-structures/binary-tree/binary-tree.ts +23 -1
  26. package/src/data-structures/binary-tree/bst.ts +4 -4
  27. package/src/data-structures/binary-tree/rb-tree.ts +418 -350
  28. package/src/types/data-structures/binary-tree/rb-tree.ts +6 -6
  29. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +215 -82
@@ -1,22 +1,389 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RBTree = exports.RBTreeNode = void 0;
3
+ exports.RedBlackTree = exports.RBTreeNode = void 0;
4
4
  const types_1 = require("../../types");
5
- const bst_1 = require("./bst");
6
- class RBTreeNode extends bst_1.BSTNode {
7
- constructor(key, value) {
8
- super(key, value);
9
- this.color = types_1.RBColor.RED;
5
+ class RBTreeNode {
6
+ constructor() {
7
+ this.key = 0;
8
+ this.color = types_1.RBTNColor.BLACK;
9
+ this.parent = null;
10
+ this.left = null;
11
+ this.right = null;
10
12
  }
11
13
  }
12
14
  exports.RBTreeNode = RBTreeNode;
13
- class RBTree extends bst_1.BST {
14
- constructor(options) {
15
- super(options);
15
+ class RedBlackTree {
16
+ constructor() {
17
+ this._NIL = new RBTreeNode();
18
+ this.NIL.color = types_1.RBTNColor.BLACK;
19
+ this.NIL.left = null;
20
+ this.NIL.right = null;
21
+ this._root = this.NIL;
16
22
  }
17
- createNode(key, value) {
18
- return new RBTreeNode(key, value);
23
+ get root() {
24
+ return this._root;
25
+ }
26
+ get NIL() {
27
+ return this._NIL;
28
+ }
29
+ /**
30
+ * The `insert` function inserts a new node with a given key into a red-black tree and fixes any
31
+ * violations of the red-black tree properties.
32
+ * @param {number} key - The key parameter is a number that represents the value to be inserted into
33
+ * the RBTree.
34
+ * @returns The function does not explicitly return anything.
35
+ */
36
+ insert(key) {
37
+ const node = new RBTreeNode();
38
+ node.parent = null;
39
+ node.key = key;
40
+ node.left = this.NIL;
41
+ node.right = this.NIL;
42
+ node.color = types_1.RBTNColor.RED;
43
+ let y = null;
44
+ let x = this.root;
45
+ while (x !== this.NIL) {
46
+ y = x;
47
+ if (node.key < x.key) {
48
+ x = x.left;
49
+ }
50
+ else {
51
+ x = x.right;
52
+ }
53
+ }
54
+ node.parent = y;
55
+ if (y === null) {
56
+ this._root = node;
57
+ }
58
+ else if (node.key < y.key) {
59
+ y.left = node;
60
+ }
61
+ else {
62
+ y.right = node;
63
+ }
64
+ if (node.parent === null) {
65
+ node.color = types_1.RBTNColor.BLACK;
66
+ return;
67
+ }
68
+ if (node.parent.parent === null) {
69
+ return;
70
+ }
71
+ this._fixInsert(node);
72
+ }
73
+ /**
74
+ * The `delete` function in TypeScript is used to remove a node with a specific key from a red-black
75
+ * tree.
76
+ * @param {RBTreeNode} node - The `node` parameter is of type `RBTreeNode` and represents the current
77
+ * node being processed in the delete operation.
78
+ * @returns The `delete` function does not return anything. It has a return type of `void`.
79
+ */
80
+ delete(key) {
81
+ const helper = (node) => {
82
+ let z = this.NIL;
83
+ let x, y;
84
+ while (node !== this.NIL) {
85
+ if (node.key === key) {
86
+ z = node;
87
+ }
88
+ if (node.key <= key) {
89
+ node = node.right;
90
+ }
91
+ else {
92
+ node = node.left;
93
+ }
94
+ }
95
+ if (z === this.NIL) {
96
+ console.log("Couldn't find key in the tree");
97
+ return;
98
+ }
99
+ y = z;
100
+ let yOriginalColor = y.color;
101
+ if (z.left === this.NIL) {
102
+ x = z.right;
103
+ this._rbTransplant(z, z.right);
104
+ }
105
+ else if (z.right === this.NIL) {
106
+ x = z.left;
107
+ this._rbTransplant(z, z.left);
108
+ }
109
+ else {
110
+ y = this.getLeftMost(z.right);
111
+ yOriginalColor = y.color;
112
+ x = y.right;
113
+ if (y.parent === z) {
114
+ x.parent = y;
115
+ }
116
+ else {
117
+ this._rbTransplant(y, y.right);
118
+ y.right = z.right;
119
+ y.right.parent = y;
120
+ }
121
+ this._rbTransplant(z, y);
122
+ y.left = z.left;
123
+ y.left.parent = y;
124
+ y.color = z.color;
125
+ }
126
+ if (yOriginalColor === 0) {
127
+ this._fixDelete(x);
128
+ }
129
+ };
130
+ helper(this.root);
131
+ }
132
+ /**
133
+ * The function `getNode` is a recursive depth-first search algorithm that searches for a node with a
134
+ * given key in a red-black tree.
135
+ * @param {number} key - The key parameter is a number that represents the value we are searching for
136
+ * in the RBTree.
137
+ * @param beginRoot - The `beginRoot` parameter is an optional parameter that represents the starting
138
+ * point for the search in the binary search tree. If no value is provided for `beginRoot`, it
139
+ * defaults to the root of the binary search tree (`this.root`).
140
+ * @returns a RBTreeNode.
141
+ */
142
+ getNode(key, beginRoot = this.root) {
143
+ const dfs = (node) => {
144
+ if (node === this.NIL || key === node.key) {
145
+ return node;
146
+ }
147
+ if (key < node.key) {
148
+ return dfs(node.left);
149
+ }
150
+ return dfs(node.right);
151
+ };
152
+ return dfs(beginRoot);
153
+ }
154
+ /**
155
+ * The function returns the leftmost node in a red-black tree.
156
+ * @param {RBTreeNode} node - The parameter "node" is of type RBTreeNode, which represents a node in
157
+ * a Red-Black Tree.
158
+ * @returns The leftmost node in the given RBTreeNode.
159
+ */
160
+ getLeftMost(node) {
161
+ while (node.left !== null && node.left !== this.NIL) {
162
+ node = node.left;
163
+ }
164
+ return node;
165
+ }
166
+ /**
167
+ * The function returns the rightmost node in a red-black tree.
168
+ * @param {RBTreeNode} node - The parameter "node" is of type RBTreeNode.
169
+ * @returns the rightmost node in a red-black tree.
170
+ */
171
+ getRightMost(node) {
172
+ while (node.right !== null && node.right !== this.NIL) {
173
+ node = node.right;
174
+ }
175
+ return node;
176
+ }
177
+ /**
178
+ * The function returns the successor of a given node in a red-black tree.
179
+ * @param {RBTreeNode} x - RBTreeNode - The node for which we want to find the successor.
180
+ * @returns the successor of the given RBTreeNode.
181
+ */
182
+ getSuccessor(x) {
183
+ if (x.right !== this.NIL) {
184
+ return this.getLeftMost(x.right);
185
+ }
186
+ let y = x.parent;
187
+ while (y !== this.NIL && y !== null && x === y.right) {
188
+ x = y;
189
+ y = y.parent;
190
+ }
191
+ return y;
192
+ }
193
+ /**
194
+ * The function returns the predecessor of a given node in a red-black tree.
195
+ * @param {RBTreeNode} x - The parameter `x` is of type `RBTreeNode`, which represents a node in a
196
+ * Red-Black Tree.
197
+ * @returns the predecessor of the given RBTreeNode 'x'.
198
+ */
199
+ getPredecessor(x) {
200
+ if (x.left !== this.NIL) {
201
+ return this.getRightMost(x.left);
202
+ }
203
+ let y = x.parent;
204
+ while (y !== this.NIL && x === y.left) {
205
+ x = y;
206
+ y = y.parent;
207
+ }
208
+ return y;
209
+ }
210
+ /**
211
+ * The function performs a left rotation on a red-black tree node.
212
+ * @param {RBTreeNode} x - The parameter `x` is a RBTreeNode object.
213
+ */
214
+ _leftRotate(x) {
215
+ const y = x.right;
216
+ x.right = y.left;
217
+ if (y.left !== this.NIL) {
218
+ y.left.parent = x;
219
+ }
220
+ y.parent = x.parent;
221
+ if (x.parent === null) {
222
+ this._root = y;
223
+ }
224
+ else if (x === x.parent.left) {
225
+ x.parent.left = y;
226
+ }
227
+ else {
228
+ x.parent.right = y;
229
+ }
230
+ y.left = x;
231
+ x.parent = y;
232
+ }
233
+ /**
234
+ * The function performs a right rotation on a red-black tree node.
235
+ * @param {RBTreeNode} x - x is a RBTreeNode, which represents the node that needs to be right
236
+ * rotated.
237
+ */
238
+ _rightRotate(x) {
239
+ const y = x.left;
240
+ x.left = y.right;
241
+ if (y.right !== this.NIL) {
242
+ y.right.parent = x;
243
+ }
244
+ y.parent = x.parent;
245
+ if (x.parent === null) {
246
+ this._root = y;
247
+ }
248
+ else if (x === x.parent.right) {
249
+ x.parent.right = y;
250
+ }
251
+ else {
252
+ x.parent.left = y;
253
+ }
254
+ y.right = x;
255
+ x.parent = y;
256
+ }
257
+ /**
258
+ * The _fixDelete function is used to rebalance the Red-Black Tree after a node deletion.
259
+ * @param {RBTreeNode} x - The parameter `x` is of type `RBTreeNode`, which represents a node in a
260
+ * red-black tree.
261
+ */
262
+ _fixDelete(x) {
263
+ let s;
264
+ while (x !== this.root && x.color === 0) {
265
+ if (x === x.parent.left) {
266
+ s = x.parent.right;
267
+ if (s.color === 1) {
268
+ s.color = types_1.RBTNColor.BLACK;
269
+ x.parent.color = types_1.RBTNColor.RED;
270
+ this._leftRotate(x.parent);
271
+ s = x.parent.right;
272
+ }
273
+ if (s.left.color === 0 && s.right.color === 0) {
274
+ s.color = types_1.RBTNColor.RED;
275
+ x = x.parent;
276
+ }
277
+ else {
278
+ if (s.right.color === 0) {
279
+ s.left.color = types_1.RBTNColor.BLACK;
280
+ s.color = types_1.RBTNColor.RED;
281
+ this._rightRotate(s);
282
+ s = x.parent.right;
283
+ }
284
+ s.color = x.parent.color;
285
+ x.parent.color = types_1.RBTNColor.BLACK;
286
+ s.right.color = types_1.RBTNColor.BLACK;
287
+ this._leftRotate(x.parent);
288
+ x = this.root;
289
+ }
290
+ }
291
+ else {
292
+ s = x.parent.left;
293
+ if (s.color === 1) {
294
+ s.color = types_1.RBTNColor.BLACK;
295
+ x.parent.color = types_1.RBTNColor.RED;
296
+ this._rightRotate(x.parent);
297
+ s = x.parent.left;
298
+ }
299
+ if (s.right.color === 0 && s.right.color === 0) {
300
+ s.color = types_1.RBTNColor.RED;
301
+ x = x.parent;
302
+ }
303
+ else {
304
+ if (s.left.color === 0) {
305
+ s.right.color = types_1.RBTNColor.BLACK;
306
+ s.color = types_1.RBTNColor.RED;
307
+ this._leftRotate(s);
308
+ s = x.parent.left;
309
+ }
310
+ s.color = x.parent.color;
311
+ x.parent.color = types_1.RBTNColor.BLACK;
312
+ s.left.color = types_1.RBTNColor.BLACK;
313
+ this._rightRotate(x.parent);
314
+ x = this.root;
315
+ }
316
+ }
317
+ }
318
+ x.color = types_1.RBTNColor.BLACK;
319
+ }
320
+ /**
321
+ * The function `_rbTransplant` replaces one node in a red-black tree with another node.
322
+ * @param {RBTreeNode} u - The parameter "u" represents a RBTreeNode object.
323
+ * @param {RBTreeNode} v - The parameter "v" is a RBTreeNode object.
324
+ */
325
+ _rbTransplant(u, v) {
326
+ if (u.parent === null) {
327
+ this._root = v;
328
+ }
329
+ else if (u === u.parent.left) {
330
+ u.parent.left = v;
331
+ }
332
+ else {
333
+ u.parent.right = v;
334
+ }
335
+ v.parent = u.parent;
336
+ }
337
+ /**
338
+ * The `_fixInsert` function is used to fix the red-black tree after an insertion operation.
339
+ * @param {RBTreeNode} k - The parameter `k` is a RBTreeNode object, which represents a node in a
340
+ * red-black tree.
341
+ */
342
+ _fixInsert(k) {
343
+ let u;
344
+ while (k.parent.color === 1) {
345
+ if (k.parent === k.parent.parent.right) {
346
+ u = k.parent.parent.left;
347
+ if (u.color === 1) {
348
+ u.color = types_1.RBTNColor.BLACK;
349
+ k.parent.color = types_1.RBTNColor.BLACK;
350
+ k.parent.parent.color = types_1.RBTNColor.RED;
351
+ k = k.parent.parent;
352
+ }
353
+ else {
354
+ if (k === k.parent.left) {
355
+ k = k.parent;
356
+ this._rightRotate(k);
357
+ }
358
+ k.parent.color = types_1.RBTNColor.BLACK;
359
+ k.parent.parent.color = types_1.RBTNColor.RED;
360
+ this._leftRotate(k.parent.parent);
361
+ }
362
+ }
363
+ else {
364
+ u = k.parent.parent.right;
365
+ if (u.color === 1) {
366
+ u.color = types_1.RBTNColor.BLACK;
367
+ k.parent.color = types_1.RBTNColor.BLACK;
368
+ k.parent.parent.color = types_1.RBTNColor.RED;
369
+ k = k.parent.parent;
370
+ }
371
+ else {
372
+ if (k === k.parent.right) {
373
+ k = k.parent;
374
+ this._leftRotate(k);
375
+ }
376
+ k.parent.color = types_1.RBTNColor.BLACK;
377
+ k.parent.parent.color = types_1.RBTNColor.RED;
378
+ this._rightRotate(k.parent.parent);
379
+ }
380
+ }
381
+ if (k === this.root) {
382
+ break;
383
+ }
384
+ }
385
+ this.root.color = types_1.RBTNColor.BLACK;
19
386
  }
20
387
  }
21
- exports.RBTree = RBTree;
388
+ exports.RedBlackTree = RedBlackTree;
22
389
  //# sourceMappingURL=rb-tree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rb-tree.js","sourceRoot":"","sources":["../../../../src/data-structures/binary-tree/rb-tree.ts"],"names":[],"mappings":";;;AAAA,uCAA6E;AAE7E,+BAAmC;AAEnC,MAAa,UAAsE,SAAQ,aAAa;IACtG,YAAY,GAAW,EAAE,KAAS;QAChC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,eAAO,CAAC,GAAG,CAAC;IAC3B,CAAC;CAIF;AARD,gCAQC;AAED,MAAa,MACX,SAAQ,SAAS;IAEjB,YAAY,OAAuB;QACjC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAEQ,UAAU,CAAC,GAAW,EAAE,KAAS;QACxC,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,CAAM,CAAC;IACzC,CAAC;CA8UF;AAvVD,wBAuVC"}
1
+ {"version":3,"file":"rb-tree.js","sourceRoot":"","sources":["../../../../src/data-structures/binary-tree/rb-tree.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,4 @@
1
- import { BinaryTreeOptions } from './binary-tree';
2
- import { RBTreeNode } from '../../../data-structures';
3
- export declare enum RBColor {
4
- RED = "RED",
5
- BLACK = "BLACK"
1
+ export declare enum RBTNColor {
2
+ RED = 1,
3
+ BLACK = 0
6
4
  }
7
- export type RBTreeNodeNested<T> = RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
8
- export type RBTreeOptions = BinaryTreeOptions & {};
@@ -1,9 +1,14 @@
1
1
  "use strict";
2
+ // import {BinaryTreeOptions} from './binary-tree';
3
+ // import {RBTreeNode} from '../../../data-structures';
2
4
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RBColor = void 0;
4
- var RBColor;
5
- (function (RBColor) {
6
- RBColor["RED"] = "RED";
7
- RBColor["BLACK"] = "BLACK";
8
- })(RBColor || (exports.RBColor = RBColor = {}));
5
+ exports.RBTNColor = void 0;
6
+ var RBTNColor;
7
+ (function (RBTNColor) {
8
+ RBTNColor[RBTNColor["RED"] = 1] = "RED";
9
+ RBTNColor[RBTNColor["BLACK"] = 0] = "BLACK";
10
+ })(RBTNColor || (exports.RBTNColor = RBTNColor = {}));
11
+ // export type RBTreeNodeNested<T> = RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
12
+ //
13
+ // export type RBTreeOptions = BinaryTreeOptions & {}
9
14
  //# sourceMappingURL=rb-tree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rb-tree.js","sourceRoot":"","sources":["../../../../../src/types/data-structures/binary-tree/rb-tree.ts"],"names":[],"mappings":";;;AAGA,IAAY,OAAuC;AAAnD,WAAY,OAAO;IAAG,sBAAW,CAAA;IAAE,0BAAe,CAAA;AAAA,CAAC,EAAvC,OAAO,uBAAP,OAAO,QAAgC"}
1
+ {"version":3,"file":"rb-tree.js","sourceRoot":"","sources":["../../../../../src/types/data-structures/binary-tree/rb-tree.ts"],"names":[],"mappings":";AAAA,mDAAmD;AACnD,uDAAuD;;;AAEvD,IAAY,SAA+B;AAA3C,WAAY,SAAS;IAAG,uCAAO,CAAA;IAAE,2CAAS,CAAA;AAAA,CAAC,EAA/B,SAAS,yBAAT,SAAS,QAAsB;AAE3C,sxBAAsxB;AACtxB,EAAE;AACF,qDAAqD"}
@@ -301,6 +301,14 @@ export declare class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = Binary
301
301
  * @returns The function `getPredecessor` returns the predecessor node of the given node `node`.
302
302
  */
303
303
  getPredecessor(node: N): N;
304
+ /**
305
+ * The function `getSuccessor` returns the next node in a binary tree given a node `x`, or `null` if
306
+ * `x` is the last node.
307
+ * @param {N} x - N - a node in a binary tree
308
+ * @returns The function `getSuccessor` returns a value of type `N` (the successor node), or `null`
309
+ * if there is no successor, or `undefined` if the input `x` is `undefined`.
310
+ */
311
+ getSuccessor(x: N): N | null | undefined;
304
312
  /**
305
313
  * The `morris` function performs a depth-first traversal of a binary tree using the Morris traversal
306
314
  * algorithm and returns an array of values obtained by applying a callback function to each node.
@@ -825,7 +825,7 @@ class BinaryTree {
825
825
  const ans = [];
826
826
  if (iterationType === types_1.IterationType.RECURSIVE) {
827
827
  const queue = new queue_1.Queue([beginRoot]);
828
- function traverse(level) {
828
+ const traverse = (level) => {
829
829
  if (queue.size === 0)
830
830
  return;
831
831
  const current = queue.shift();
@@ -835,7 +835,7 @@ class BinaryTree {
835
835
  if (current.right)
836
836
  queue.push(current.right);
837
837
  traverse(level + 1);
838
- }
838
+ };
839
839
  traverse(0);
840
840
  }
841
841
  else {
@@ -920,6 +920,24 @@ class BinaryTree {
920
920
  return node;
921
921
  }
922
922
  }
923
+ /**
924
+ * The function `getSuccessor` returns the next node in a binary tree given a node `x`, or `null` if
925
+ * `x` is the last node.
926
+ * @param {N} x - N - a node in a binary tree
927
+ * @returns The function `getSuccessor` returns a value of type `N` (the successor node), or `null`
928
+ * if there is no successor, or `undefined` if the input `x` is `undefined`.
929
+ */
930
+ getSuccessor(x) {
931
+ if (x.right) {
932
+ return this.getLeftMost(x.right);
933
+ }
934
+ let y = x.parent;
935
+ while (y && y && x === y.right) {
936
+ x = y;
937
+ y = y.parent;
938
+ }
939
+ return y;
940
+ }
923
941
  // --- start additional methods ---
924
942
  /**
925
943
  * The `morris` function performs a depth-first traversal of a binary tree using the Morris traversal
@@ -1049,10 +1067,12 @@ class BinaryTree {
1049
1067
  }
1050
1068
  else {
1051
1069
  if (node.left) {
1070
+ // @ts-ignore
1052
1071
  yield* this[Symbol.iterator](node.left);
1053
1072
  }
1054
1073
  yield node.key;
1055
1074
  if (node.right) {
1075
+ // @ts-ignore
1056
1076
  yield* this[Symbol.iterator](node.right);
1057
1077
  }
1058
1078
  }
@@ -43,7 +43,7 @@ export declare class BST<V = any, N extends BSTNode<V, N> = BSTNode<V, BSTNodeNe
43
43
  /**
44
44
  * The `addMany` function is used to efficiently add multiple nodes to a binary search tree while
45
45
  * maintaining balance.
46
- * @param {[BTNKey | N, N['value']][]} keysOrNodes - The `arr` parameter in the `addMany` function
46
+ * @param {[BTNKey | N, V][]} keysOrNodes - The `arr` parameter in the `addMany` function
47
47
  * represents an array of keys or nodes that need to be added to the binary search tree. It can be an
48
48
  * array of `BTNKey` or `N` (which represents the node type in the binary search tree) or
49
49
  * `null
@@ -125,7 +125,7 @@ class BST extends binary_tree_1.BinaryTree {
125
125
  /**
126
126
  * The `addMany` function is used to efficiently add multiple nodes to a binary search tree while
127
127
  * maintaining balance.
128
- * @param {[BTNKey | N, N['value']][]} keysOrNodes - The `arr` parameter in the `addMany` function
128
+ * @param {[BTNKey | N, V][]} keysOrNodes - The `arr` parameter in the `addMany` function
129
129
  * represents an array of keys or nodes that need to be added to the binary search tree. It can be an
130
130
  * array of `BTNKey` or `N` (which represents the node type in the binary search tree) or
131
131
  * `null
@@ -1,11 +1,97 @@
1
- import { BTNKey, RBColor, RBTreeNodeNested, RBTreeOptions } from '../../types';
2
- import { IBinaryTree } from '../../interfaces';
3
- import { BST, BSTNode } from './bst';
4
- export declare class RBTreeNode<V = any, N extends RBTreeNode<V, N> = RBTreeNodeNested<V>> extends BSTNode<V, N> {
5
- constructor(key: BTNKey, value?: V);
6
- color: RBColor;
1
+ export declare class RBTreeNode {
2
+ key: number;
3
+ parent: RBTreeNode;
4
+ left: RBTreeNode;
5
+ right: RBTreeNode;
6
+ color: number;
7
+ constructor();
7
8
  }
8
- export declare class RBTree<V, N extends RBTreeNode<V, N> = RBTreeNode<V, RBTreeNodeNested<V>>> extends BST<V, N> implements IBinaryTree<V, N> {
9
- constructor(options?: RBTreeOptions);
10
- createNode(key: BTNKey, value?: V): N;
9
+ export declare class RedBlackTree {
10
+ constructor();
11
+ protected _root: RBTreeNode;
12
+ get root(): RBTreeNode;
13
+ protected _NIL: RBTreeNode;
14
+ get NIL(): RBTreeNode;
15
+ /**
16
+ * The `insert` function inserts a new node with a given key into a red-black tree and fixes any
17
+ * violations of the red-black tree properties.
18
+ * @param {number} key - The key parameter is a number that represents the value to be inserted into
19
+ * the RBTree.
20
+ * @returns The function does not explicitly return anything.
21
+ */
22
+ insert(key: number): void;
23
+ /**
24
+ * The `delete` function in TypeScript is used to remove a node with a specific key from a red-black
25
+ * tree.
26
+ * @param {RBTreeNode} node - The `node` parameter is of type `RBTreeNode` and represents the current
27
+ * node being processed in the delete operation.
28
+ * @returns The `delete` function does not return anything. It has a return type of `void`.
29
+ */
30
+ delete(key: number): void;
31
+ /**
32
+ * The function `getNode` is a recursive depth-first search algorithm that searches for a node with a
33
+ * given key in a red-black tree.
34
+ * @param {number} key - The key parameter is a number that represents the value we are searching for
35
+ * in the RBTree.
36
+ * @param beginRoot - The `beginRoot` parameter is an optional parameter that represents the starting
37
+ * point for the search in the binary search tree. If no value is provided for `beginRoot`, it
38
+ * defaults to the root of the binary search tree (`this.root`).
39
+ * @returns a RBTreeNode.
40
+ */
41
+ getNode(key: number, beginRoot?: RBTreeNode): RBTreeNode;
42
+ /**
43
+ * The function returns the leftmost node in a red-black tree.
44
+ * @param {RBTreeNode} node - The parameter "node" is of type RBTreeNode, which represents a node in
45
+ * a Red-Black Tree.
46
+ * @returns The leftmost node in the given RBTreeNode.
47
+ */
48
+ getLeftMost(node: RBTreeNode): RBTreeNode;
49
+ /**
50
+ * The function returns the rightmost node in a red-black tree.
51
+ * @param {RBTreeNode} node - The parameter "node" is of type RBTreeNode.
52
+ * @returns the rightmost node in a red-black tree.
53
+ */
54
+ getRightMost(node: RBTreeNode): RBTreeNode;
55
+ /**
56
+ * The function returns the successor of a given node in a red-black tree.
57
+ * @param {RBTreeNode} x - RBTreeNode - The node for which we want to find the successor.
58
+ * @returns the successor of the given RBTreeNode.
59
+ */
60
+ getSuccessor(x: RBTreeNode): RBTreeNode;
61
+ /**
62
+ * The function returns the predecessor of a given node in a red-black tree.
63
+ * @param {RBTreeNode} x - The parameter `x` is of type `RBTreeNode`, which represents a node in a
64
+ * Red-Black Tree.
65
+ * @returns the predecessor of the given RBTreeNode 'x'.
66
+ */
67
+ getPredecessor(x: RBTreeNode): RBTreeNode;
68
+ /**
69
+ * The function performs a left rotation on a red-black tree node.
70
+ * @param {RBTreeNode} x - The parameter `x` is a RBTreeNode object.
71
+ */
72
+ protected _leftRotate(x: RBTreeNode): void;
73
+ /**
74
+ * The function performs a right rotation on a red-black tree node.
75
+ * @param {RBTreeNode} x - x is a RBTreeNode, which represents the node that needs to be right
76
+ * rotated.
77
+ */
78
+ protected _rightRotate(x: RBTreeNode): void;
79
+ /**
80
+ * The _fixDelete function is used to rebalance the Red-Black Tree after a node deletion.
81
+ * @param {RBTreeNode} x - The parameter `x` is of type `RBTreeNode`, which represents a node in a
82
+ * red-black tree.
83
+ */
84
+ protected _fixDelete(x: RBTreeNode): void;
85
+ /**
86
+ * The function `_rbTransplant` replaces one node in a red-black tree with another node.
87
+ * @param {RBTreeNode} u - The parameter "u" represents a RBTreeNode object.
88
+ * @param {RBTreeNode} v - The parameter "v" is a RBTreeNode object.
89
+ */
90
+ protected _rbTransplant(u: RBTreeNode, v: RBTreeNode): void;
91
+ /**
92
+ * The `_fixInsert` function is used to fix the red-black tree after an insertion operation.
93
+ * @param {RBTreeNode} k - The parameter `k` is a RBTreeNode object, which represents a node in a
94
+ * red-black tree.
95
+ */
96
+ protected _fixInsert(k: RBTreeNode): void;
11
97
  }