heap-typed 1.51.7 → 1.51.8
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 +72 -80
- package/dist/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -12
- package/dist/data-structures/binary-tree/avl-tree-multi-map.js +1 -10
- package/dist/data-structures/binary-tree/avl-tree.d.ts +3 -3
- package/dist/data-structures/binary-tree/avl-tree.js +12 -12
- package/dist/data-structures/binary-tree/binary-tree.d.ts +5 -12
- package/dist/data-structures/binary-tree/binary-tree.js +22 -32
- package/dist/data-structures/binary-tree/bst.d.ts +32 -77
- package/dist/data-structures/binary-tree/bst.js +68 -136
- package/dist/data-structures/binary-tree/rb-tree.d.ts +3 -13
- package/dist/data-structures/binary-tree/rb-tree.js +3 -20
- package/dist/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
- package/dist/data-structures/heap/heap.d.ts +1 -3
- package/dist/interfaces/binary-tree.d.ts +3 -3
- package/dist/types/common.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -2
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +3 -2
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +4 -4
- package/dist/types/data-structures/binary-tree/bst.d.ts +6 -5
- package/dist/types/data-structures/binary-tree/rb-tree.d.ts +4 -3
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -2
- package/dist/types/utils/utils.d.ts +10 -1
- package/dist/utils/utils.d.ts +2 -1
- package/dist/utils/utils.js +29 -1
- package/package.json +2 -2
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +4 -12
- package/src/data-structures/binary-tree/avl-tree.ts +15 -14
- package/src/data-structures/binary-tree/binary-tree.ts +29 -38
- package/src/data-structures/binary-tree/bst.ts +78 -148
- package/src/data-structures/binary-tree/rb-tree.ts +8 -22
- package/src/data-structures/binary-tree/tree-multi-map.ts +4 -3
- package/src/data-structures/heap/heap.ts +1 -1
- package/src/interfaces/binary-tree.ts +4 -3
- package/src/types/common.ts +1 -1
- package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +3 -2
- package/src/types/data-structures/binary-tree/avl-tree.ts +3 -2
- package/src/types/data-structures/binary-tree/binary-tree.ts +5 -5
- package/src/types/data-structures/binary-tree/bst.ts +6 -5
- package/src/types/data-structures/binary-tree/rb-tree.ts +4 -3
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +3 -2
- package/src/types/utils/utils.ts +14 -1
- package/src/utils/utils.ts +20 -1
package/README.md
CHANGED
|
@@ -45,8 +45,8 @@ Max Heap
|
|
|
45
45
|
import {MinHeap, MaxHeap} from 'data-structure-typed';
|
|
46
46
|
// /* or if you prefer */ import {MinHeap, MaxHeap} from 'heap-typed';
|
|
47
47
|
|
|
48
|
-
const minNumHeap = new MinHeap<number>();
|
|
49
|
-
minNumHeap.add(
|
|
48
|
+
const minNumHeap = new MinHeap<number>([1, 6, 2, 0, 5]);
|
|
49
|
+
minNumHeap.add(9);
|
|
50
50
|
minNumHeap.has(1) // true
|
|
51
51
|
minNumHeap.has(2) // true
|
|
52
52
|
minNumHeap.poll() // 0
|
|
@@ -54,6 +54,7 @@ Max Heap
|
|
|
54
54
|
minNumHeap.peek() // 2
|
|
55
55
|
minNumHeap.has(1); // false
|
|
56
56
|
minNumHeap.has(2); // true
|
|
57
|
+
|
|
57
58
|
const arrFromHeap = minNumHeap.toArray();
|
|
58
59
|
arrFromHeap.length // 4
|
|
59
60
|
arrFromHeap[0] // 2
|
|
@@ -61,38 +62,33 @@ Max Heap
|
|
|
61
62
|
arrFromHeap[2] // 9
|
|
62
63
|
arrFromHeap[3] // 6
|
|
63
64
|
minNumHeap.sort() // [2, 5, 6, 9]
|
|
65
|
+
|
|
66
|
+
const maxHeap = new MaxHeap<{ keyA: string }>([], {comparator: (a, b) => b.keyA - a.keyA});
|
|
67
|
+
const obj1 = {keyA: 'a1'}, obj6 = {keyA: 'a6'}, obj5 = {keyA: 'a5'}, obj2 = {keyA: 'a2'},
|
|
68
|
+
obj0 = {keyA: 'a0'}, obj9 = {keyA: 'a9'};
|
|
64
69
|
|
|
70
|
+
maxHeap.add(obj1);
|
|
71
|
+
maxHeap.has(obj1) // true
|
|
72
|
+
maxHeap.has(obj9) // false
|
|
73
|
+
maxHeap.add(obj6);
|
|
74
|
+
maxHeap.has(obj6) // true
|
|
75
|
+
maxHeap.add(obj5);
|
|
76
|
+
maxHeap.add(obj2);
|
|
77
|
+
maxHeap.add(obj0);
|
|
78
|
+
maxHeap.add(obj9);
|
|
79
|
+
maxHeap.has(obj9) // true
|
|
65
80
|
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
myObj0 = {keyA: 'a0'}, myObj9 = {keyA: 'a9'};
|
|
69
|
-
maxHeap.add(1, myObj1);
|
|
70
|
-
maxHeap.has(myObj1) // true
|
|
71
|
-
maxHeap.has(myObj9) // false
|
|
72
|
-
maxHeap.add(6, myObj6);
|
|
73
|
-
maxHeap.has(myObj6) // true
|
|
74
|
-
maxHeap.add(5, myObj5);
|
|
75
|
-
maxHeap.has(myObj5) // true
|
|
76
|
-
maxHeap.add(2, myObj2);
|
|
77
|
-
maxHeap.has(myObj2) // true
|
|
78
|
-
maxHeap.has(myObj6) // true
|
|
79
|
-
maxHeap.add(0, myObj0);
|
|
80
|
-
maxHeap.has(myObj0) // true
|
|
81
|
-
maxHeap.has(myObj9) // false
|
|
82
|
-
maxHeap.add(9, myObj9);
|
|
83
|
-
maxHeap.has(myObj9) // true
|
|
84
|
-
|
|
85
|
-
const peek9 = maxHeap.peek(true);
|
|
86
|
-
peek9 && peek9.val && peek9.val.keyA // 'a9'
|
|
81
|
+
const peek9 = maxHeap.peek();
|
|
82
|
+
console.log(peek9.keyA) // 'a9'
|
|
87
83
|
|
|
88
|
-
const heapToArr = maxHeap.toArray(
|
|
89
|
-
heapToArr.map(
|
|
84
|
+
const heapToArr = maxHeap.toArray();
|
|
85
|
+
console.log(heapToArr.map(ele => ele?.keyA)); // ['a9', 'a2', 'a6', 'a1', 'a0', 'a5']
|
|
90
86
|
|
|
91
87
|
const values = ['a9', 'a6', 'a5', 'a2', 'a1', 'a0'];
|
|
92
88
|
let i = 0;
|
|
93
89
|
while (maxHeap.size > 0) {
|
|
94
|
-
const polled = maxHeap.poll(
|
|
95
|
-
|
|
90
|
+
const polled = maxHeap.poll();
|
|
91
|
+
console.log(polled.keyA) // values[i]
|
|
96
92
|
i++;
|
|
97
93
|
}
|
|
98
94
|
```
|
|
@@ -100,59 +96,55 @@ Max Heap
|
|
|
100
96
|
#### JS
|
|
101
97
|
|
|
102
98
|
```javascript
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const polled = maxHeap.poll(true);
|
|
153
|
-
polled && polled.val && polled.val.keyA // values[i]
|
|
154
|
-
i++;
|
|
155
|
-
}
|
|
99
|
+
const {MinHeap, MaxHeap} = require('data-structure-typed');
|
|
100
|
+
// /* or if you prefer */ const {MinHeap, MaxHeap} = require('heap-typed');
|
|
101
|
+
|
|
102
|
+
const minNumHeap = new MinHeap([1, 6, 2, 0, 5]);
|
|
103
|
+
minNumHeap.add(9);
|
|
104
|
+
minNumHeap.has(1) // true
|
|
105
|
+
minNumHeap.has(2) // true
|
|
106
|
+
minNumHeap.poll() // 0
|
|
107
|
+
minNumHeap.poll() // 1
|
|
108
|
+
minNumHeap.peek() // 2
|
|
109
|
+
minNumHeap.has(1); // false
|
|
110
|
+
minNumHeap.has(2); // true
|
|
111
|
+
|
|
112
|
+
const arrFromHeap = minNumHeap.toArray();
|
|
113
|
+
arrFromHeap.length // 4
|
|
114
|
+
arrFromHeap[0] // 2
|
|
115
|
+
arrFromHeap[1] // 5
|
|
116
|
+
arrFromHeap[2] // 9
|
|
117
|
+
arrFromHeap[3] // 6
|
|
118
|
+
minNumHeap.sort() // [2, 5, 6, 9]
|
|
119
|
+
|
|
120
|
+
const maxHeap = new MaxHeap([], {comparator: (a, b) => b.keyA - a.keyA});
|
|
121
|
+
const obj1 = {keyA: 'a1'}, obj6 = {keyA: 'a6'}, obj5 = {keyA: 'a5'}, obj2 = {keyA: 'a2'},
|
|
122
|
+
obj0 = {keyA: 'a0'}, obj9 = {keyA: 'a9'};
|
|
123
|
+
|
|
124
|
+
maxHeap.add(obj1);
|
|
125
|
+
maxHeap.has(obj1) // true
|
|
126
|
+
maxHeap.has(obj9) // false
|
|
127
|
+
maxHeap.add(obj6);
|
|
128
|
+
maxHeap.has(obj6) // true
|
|
129
|
+
maxHeap.add(obj5);
|
|
130
|
+
maxHeap.add(obj2);
|
|
131
|
+
maxHeap.add(obj0);
|
|
132
|
+
maxHeap.add(obj9);
|
|
133
|
+
maxHeap.has(obj9) // true
|
|
134
|
+
|
|
135
|
+
const peek9 = maxHeap.peek();
|
|
136
|
+
console.log(peek9.keyA) // 'a9'
|
|
137
|
+
|
|
138
|
+
const heapToArr = maxHeap.toArray();
|
|
139
|
+
console.log(heapToArr.map(ele => ele?.keyA)); // ['a9', 'a2', 'a6', 'a1', 'a0', 'a5']
|
|
140
|
+
|
|
141
|
+
const values = ['a9', 'a6', 'a5', 'a2', 'a1', 'a0'];
|
|
142
|
+
let i = 0;
|
|
143
|
+
while (maxHeap.size > 0) {
|
|
144
|
+
const polled = maxHeap.poll();
|
|
145
|
+
console.log(polled.keyA) // values[i]
|
|
146
|
+
i++;
|
|
147
|
+
}
|
|
156
148
|
```
|
|
157
149
|
|
|
158
150
|
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
|
-
import type { AVLTreeMultiMapNested, AVLTreeMultiMapNodeNested, AVLTreeMultiMapOptions, BinaryTreeDeleteResult, BSTNKeyOrNode, BTNCallback, IterationType, KeyOrNodeOrEntry } from '../../types';
|
|
8
|
+
import type { AVLTreeMultiMapNested, AVLTreeMultiMapNodeNested, AVLTreeMultiMapOptions, BinaryTreeDeleteResult, BSTNKeyOrNode, BTNCallback, Comparable, IterationType, KeyOrNodeOrEntry } from '../../types';
|
|
9
9
|
import { IBinaryTree } from '../../interfaces';
|
|
10
10
|
import { AVLTree, AVLTreeNode } from './avl-tree';
|
|
11
|
-
export declare class AVLTreeMultiMapNode<K
|
|
11
|
+
export declare class AVLTreeMultiMapNode<K extends Comparable, V = any, NODE extends AVLTreeMultiMapNode<K, V, NODE> = AVLTreeMultiMapNodeNested<K, V>> extends AVLTreeNode<K, V, NODE> {
|
|
12
12
|
/**
|
|
13
13
|
* The constructor function initializes a BinaryTreeNode object with a key, value, and count.
|
|
14
14
|
* @param {K} key - The `key` parameter is of type `K` and represents the unique identifier
|
|
@@ -36,7 +36,7 @@ export declare class AVLTreeMultiMapNode<K = any, V = any, NODE extends AVLTreeM
|
|
|
36
36
|
/**
|
|
37
37
|
* The only distinction between a AVLTreeMultiMap and a AVLTree lies in the ability of the former to store duplicate nodes through the utilization of counters.
|
|
38
38
|
*/
|
|
39
|
-
export declare class AVLTreeMultiMap<K
|
|
39
|
+
export declare class AVLTreeMultiMap<K extends Comparable, V = any, NODE extends AVLTreeMultiMapNode<K, V, NODE> = AVLTreeMultiMapNode<K, V, AVLTreeMultiMapNodeNested<K, V>>, TREE extends AVLTreeMultiMap<K, V, NODE, TREE> = AVLTreeMultiMap<K, V, NODE, AVLTreeMultiMapNested<K, V, NODE>>> extends AVLTree<K, V, NODE, TREE> implements IBinaryTree<K, V, NODE, TREE> {
|
|
40
40
|
constructor(keysOrNodesOrEntries?: Iterable<KeyOrNodeOrEntry<K, V, NODE>>, options?: AVLTreeMultiMapOptions<K>);
|
|
41
41
|
protected _count: number;
|
|
42
42
|
/**
|
|
@@ -68,15 +68,6 @@ export declare class AVLTreeMultiMap<K = any, V = any, NODE extends AVLTreeMulti
|
|
|
68
68
|
* @returns A new instance of the BSTNode class with the specified key, value, and count (if provided).
|
|
69
69
|
*/
|
|
70
70
|
createNode(key: K, value?: V, count?: number): NODE;
|
|
71
|
-
/**
|
|
72
|
-
* The function creates a new AVLTreeMultiMap object with the specified options and returns it.
|
|
73
|
-
* @param [options] - The `options` parameter is an optional object that contains additional
|
|
74
|
-
* configuration options for creating the `AVLTreeMultiMap` object. It can include properties such as
|
|
75
|
-
* `iterationType` and `variant`, which are used to specify the type of iteration and the variant of
|
|
76
|
-
* the tree, respectively. These properties can be
|
|
77
|
-
* @returns a new instance of the `AVLTreeMultiMap` class, with the provided options merged with the
|
|
78
|
-
* default options. The returned value is casted as `TREE`.
|
|
79
|
-
*/
|
|
80
71
|
createTree(options?: AVLTreeMultiMapOptions<K>): TREE;
|
|
81
72
|
/**
|
|
82
73
|
* The function `keyValueOrEntryToNode` converts an keyOrNodeOrEntry object into a node object.
|
|
@@ -83,17 +83,8 @@ class AVLTreeMultiMap extends avl_tree_1.AVLTree {
|
|
|
83
83
|
createNode(key, value, count) {
|
|
84
84
|
return new AVLTreeMultiMapNode(key, value, count);
|
|
85
85
|
}
|
|
86
|
-
/**
|
|
87
|
-
* The function creates a new AVLTreeMultiMap object with the specified options and returns it.
|
|
88
|
-
* @param [options] - The `options` parameter is an optional object that contains additional
|
|
89
|
-
* configuration options for creating the `AVLTreeMultiMap` object. It can include properties such as
|
|
90
|
-
* `iterationType` and `variant`, which are used to specify the type of iteration and the variant of
|
|
91
|
-
* the tree, respectively. These properties can be
|
|
92
|
-
* @returns a new instance of the `AVLTreeMultiMap` class, with the provided options merged with the
|
|
93
|
-
* default options. The returned value is casted as `TREE`.
|
|
94
|
-
*/
|
|
95
86
|
createTree(options) {
|
|
96
|
-
return new AVLTreeMultiMap([], Object.assign({ iterationType: this.iterationType,
|
|
87
|
+
return new AVLTreeMultiMap([], Object.assign({ iterationType: this.iterationType, comparator: this.comparator }, options));
|
|
97
88
|
}
|
|
98
89
|
/**
|
|
99
90
|
* The function `keyValueOrEntryToNode` converts an keyOrNodeOrEntry object into a node object.
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
8
|
import { BST, BSTNode } from './bst';
|
|
9
|
-
import type { AVLTreeNested, AVLTreeNodeNested, AVLTreeOptions, BinaryTreeDeleteResult, BSTNKeyOrNode, BTNCallback, KeyOrNodeOrEntry } from '../../types';
|
|
9
|
+
import type { AVLTreeNested, AVLTreeNodeNested, AVLTreeOptions, BinaryTreeDeleteResult, BSTNKeyOrNode, BTNCallback, Comparable, KeyOrNodeOrEntry } from '../../types';
|
|
10
10
|
import { IBinaryTree } from '../../interfaces';
|
|
11
|
-
export declare class AVLTreeNode<K
|
|
11
|
+
export declare class AVLTreeNode<K extends Comparable, V = any, NODE extends AVLTreeNode<K, V, NODE> = AVLTreeNodeNested<K, V>> extends BSTNode<K, V, NODE> {
|
|
12
12
|
/**
|
|
13
13
|
* The constructor function initializes a new instance of a class with a key and an optional value,
|
|
14
14
|
* and sets the height property to 0.
|
|
@@ -40,7 +40,7 @@ export declare class AVLTreeNode<K = any, V = any, NODE extends AVLTreeNode<K, V
|
|
|
40
40
|
* 6. Complex Insertions and Deletions: Due to rebalancing, these operations are more complex than in a regular BST.
|
|
41
41
|
* 7. Path Length: The path length from the root to any leaf is longer compared to an unbalanced BST, but shorter than a linear chain of nodes.
|
|
42
42
|
*/
|
|
43
|
-
export declare class AVLTree<K
|
|
43
|
+
export declare class AVLTree<K extends Comparable, V = any, NODE extends AVLTreeNode<K, V, NODE> = AVLTreeNode<K, V, AVLTreeNodeNested<K, V>>, TREE extends AVLTree<K, V, NODE, TREE> = AVLTree<K, V, NODE, AVLTreeNested<K, V, NODE>>> extends BST<K, V, NODE, TREE> implements IBinaryTree<K, V, NODE, TREE> {
|
|
44
44
|
/**
|
|
45
45
|
* The constructor function initializes an AVLTree object with optional keysOrNodesOrEntries and options.
|
|
46
46
|
* @param [keysOrNodesOrEntries] - The `keysOrNodesOrEntries` parameter is an optional iterable of `KeyOrNodeOrEntry<K, V, NODE>`
|
|
@@ -83,7 +83,7 @@ class AVLTree extends bst_1.BST {
|
|
|
83
83
|
* @returns a new AVLTree object.
|
|
84
84
|
*/
|
|
85
85
|
createTree(options) {
|
|
86
|
-
return new AVLTree([], Object.assign({ iterationType: this.iterationType,
|
|
86
|
+
return new AVLTree([], Object.assign({ iterationType: this.iterationType, comparator: this.comparator }, options));
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
89
|
* The function checks if an keyOrNodeOrEntry is an instance of AVLTreeNode.
|
|
@@ -157,21 +157,21 @@ class AVLTree extends bst_1.BST {
|
|
|
157
157
|
* if either `srcNode` or `destNode` is undefined.
|
|
158
158
|
*/
|
|
159
159
|
_swapProperties(srcNode, destNode) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if (
|
|
163
|
-
const { key, value, height } =
|
|
160
|
+
const srcNodeEnsured = this.ensureNode(srcNode);
|
|
161
|
+
const destNodeEnsured = this.ensureNode(destNode);
|
|
162
|
+
if (srcNodeEnsured && destNodeEnsured) {
|
|
163
|
+
const { key, value, height } = destNodeEnsured;
|
|
164
164
|
const tempNode = this.createNode(key, value);
|
|
165
165
|
if (tempNode) {
|
|
166
166
|
tempNode.height = height;
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
167
|
+
destNodeEnsured.key = srcNodeEnsured.key;
|
|
168
|
+
destNodeEnsured.value = srcNodeEnsured.value;
|
|
169
|
+
destNodeEnsured.height = srcNodeEnsured.height;
|
|
170
|
+
srcNodeEnsured.key = tempNode.key;
|
|
171
|
+
srcNodeEnsured.value = tempNode.value;
|
|
172
|
+
srcNodeEnsured.height = tempNode.height;
|
|
173
173
|
}
|
|
174
|
-
return
|
|
174
|
+
return destNodeEnsured;
|
|
175
175
|
}
|
|
176
176
|
return undefined;
|
|
177
177
|
}
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
|
-
import type { BinaryTreeDeleteResult, BinaryTreeNested, BinaryTreeNodeNested, BinaryTreeOptions, BinaryTreePrintOptions, BTNCallback, BTNEntry, DFSOrderPattern, EntryCallback, KeyOrNodeOrEntry, NodeDisplayLayout } from '../../types';
|
|
9
|
-
import { FamilyPosition, IterationType } from '../../types';
|
|
8
|
+
import type { BinaryTreeDeleteResult, BinaryTreeNested, BinaryTreeNodeNested, BinaryTreeOptions, BinaryTreePrintOptions, BTNCallback, BTNEntry, Comparable, DFSOrderPattern, EntryCallback, FamilyPosition, IterationType, KeyOrNodeOrEntry, NodeDisplayLayout } from '../../types';
|
|
10
9
|
import { IBinaryTree } from '../../interfaces';
|
|
11
10
|
import { IterableEntryBase } from '../base';
|
|
12
11
|
/**
|
|
@@ -14,7 +13,7 @@ import { IterableEntryBase } from '../base';
|
|
|
14
13
|
* @template V - The type of data stored in the node.
|
|
15
14
|
* @template NODE - The type of the family relationship in the binary tree.
|
|
16
15
|
*/
|
|
17
|
-
export declare class BinaryTreeNode<K
|
|
16
|
+
export declare class BinaryTreeNode<K extends Comparable, V = any, NODE extends BinaryTreeNode<K, V, NODE> = BinaryTreeNode<K, V, BinaryTreeNodeNested<K, V>>> {
|
|
18
17
|
key: K;
|
|
19
18
|
value?: V;
|
|
20
19
|
parent?: NODE;
|
|
@@ -66,7 +65,7 @@ export declare class BinaryTreeNode<K = any, V = any, NODE extends BinaryTreeNod
|
|
|
66
65
|
* 4. Subtrees: Each child of a node forms the root of a subtree.
|
|
67
66
|
* 5. Leaf Nodes: Nodes without children are leaves.
|
|
68
67
|
*/
|
|
69
|
-
export declare class BinaryTree<K
|
|
68
|
+
export declare class BinaryTree<K extends Comparable, V = any, NODE extends BinaryTreeNode<K, V, NODE> = BinaryTreeNode<K, V, BinaryTreeNodeNested<K, V>>, TREE extends BinaryTree<K, V, NODE, TREE> = BinaryTree<K, V, NODE, BinaryTreeNested<K, V, NODE>>> extends IterableEntryBase<K, V | undefined> implements IBinaryTree<K, V, NODE, TREE> {
|
|
70
69
|
iterationType: IterationType;
|
|
71
70
|
/**
|
|
72
71
|
* The constructor function initializes a binary tree object with optional keysOrNodesOrEntries and options.
|
|
@@ -77,13 +76,7 @@ export declare class BinaryTree<K = any, V = any, NODE extends BinaryTreeNode<K,
|
|
|
77
76
|
* `Partial<BinaryTreeOptions>`, which means that not all properties of `BinaryTreeOptions` are
|
|
78
77
|
* required.
|
|
79
78
|
*/
|
|
80
|
-
constructor(keysOrNodesOrEntries?: Iterable<KeyOrNodeOrEntry<K, V, NODE>>, options?: BinaryTreeOptions
|
|
81
|
-
protected _extractor: (key: K) => number;
|
|
82
|
-
/**
|
|
83
|
-
* The function returns the value of the `_extractor` property.
|
|
84
|
-
* @returns The `_extractor` property is being returned.
|
|
85
|
-
*/
|
|
86
|
-
get extractor(): (key: K) => number;
|
|
79
|
+
constructor(keysOrNodesOrEntries?: Iterable<KeyOrNodeOrEntry<K, V, NODE>>, options?: BinaryTreeOptions);
|
|
87
80
|
protected _root?: NODE | null;
|
|
88
81
|
/**
|
|
89
82
|
* The function returns the root node, which can be of type NODE, null, or undefined.
|
|
@@ -117,7 +110,7 @@ export declare class BinaryTree<K = any, V = any, NODE extends BinaryTreeNode<K,
|
|
|
117
110
|
* you can provide only a subset of the properties defined in the `BinaryTreeOptions` interface.
|
|
118
111
|
* @returns a new instance of a binary tree.
|
|
119
112
|
*/
|
|
120
|
-
createTree(options?: Partial<BinaryTreeOptions
|
|
113
|
+
createTree(options?: Partial<BinaryTreeOptions>): TREE;
|
|
121
114
|
/**
|
|
122
115
|
* The function `keyValueOrEntryToNode` converts an keyOrNodeOrEntry object into a node object.
|
|
123
116
|
* @param keyOrNodeOrEntry - The `keyOrNodeOrEntry` parameter is of type `KeyOrNodeOrEntry<K, V, NODE>`.
|
|
@@ -106,27 +106,17 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
106
106
|
constructor(keysOrNodesOrEntries = [], options) {
|
|
107
107
|
super();
|
|
108
108
|
this.iterationType = 'ITERATIVE';
|
|
109
|
-
this._extractor = (key) => (typeof key === 'number' ? key : Number(key));
|
|
110
109
|
this._NIL = new BinaryTreeNode(NaN);
|
|
111
110
|
this._DEFAULT_CALLBACK = (node) => (node ? node.key : undefined);
|
|
112
111
|
if (options) {
|
|
113
|
-
const { iterationType
|
|
112
|
+
const { iterationType } = options;
|
|
114
113
|
if (iterationType)
|
|
115
114
|
this.iterationType = iterationType;
|
|
116
|
-
if (extractor)
|
|
117
|
-
this._extractor = extractor;
|
|
118
115
|
}
|
|
119
116
|
this._size = 0;
|
|
120
117
|
if (keysOrNodesOrEntries)
|
|
121
118
|
this.addMany(keysOrNodesOrEntries);
|
|
122
119
|
}
|
|
123
|
-
/**
|
|
124
|
-
* The function returns the value of the `_extractor` property.
|
|
125
|
-
* @returns The `_extractor` property is being returned.
|
|
126
|
-
*/
|
|
127
|
-
get extractor() {
|
|
128
|
-
return this._extractor;
|
|
129
|
-
}
|
|
130
120
|
/**
|
|
131
121
|
* The function returns the root node, which can be of type NODE, null, or undefined.
|
|
132
122
|
* @returns The method is returning the value of the `_root` property, which can be of type `NODE`,
|
|
@@ -715,7 +705,7 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
715
705
|
const dfs = (cur, min, max) => {
|
|
716
706
|
if (!this.isRealNode(cur))
|
|
717
707
|
return true;
|
|
718
|
-
const numKey =
|
|
708
|
+
const numKey = Number(cur.key);
|
|
719
709
|
if (numKey <= min || numKey >= max)
|
|
720
710
|
return false;
|
|
721
711
|
return dfs(cur.left, min, numKey) && dfs(cur.right, numKey, max);
|
|
@@ -736,7 +726,7 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
736
726
|
curr = curr.left;
|
|
737
727
|
}
|
|
738
728
|
curr = stack.pop();
|
|
739
|
-
const numKey =
|
|
729
|
+
const numKey = Number(curr.key);
|
|
740
730
|
if (!this.isRealNode(curr) || (!checkMax && prev >= numKey) || (checkMax && prev <= numKey))
|
|
741
731
|
return false;
|
|
742
732
|
prev = numKey;
|
|
@@ -766,15 +756,15 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
766
756
|
* @returns the depth of the `dist` relative to the `beginRoot`.
|
|
767
757
|
*/
|
|
768
758
|
getDepth(dist, beginRoot = this.root) {
|
|
769
|
-
|
|
770
|
-
|
|
759
|
+
let distEnsured = this.ensureNode(dist);
|
|
760
|
+
const beginRootEnsured = this.ensureNode(beginRoot);
|
|
771
761
|
let depth = 0;
|
|
772
|
-
while (
|
|
773
|
-
if (
|
|
762
|
+
while (distEnsured === null || distEnsured === void 0 ? void 0 : distEnsured.parent) {
|
|
763
|
+
if (distEnsured === beginRootEnsured) {
|
|
774
764
|
return depth;
|
|
775
765
|
}
|
|
776
766
|
depth++;
|
|
777
|
-
|
|
767
|
+
distEnsured = distEnsured.parent;
|
|
778
768
|
}
|
|
779
769
|
return depth;
|
|
780
770
|
}
|
|
@@ -908,16 +898,16 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
908
898
|
getPathToRoot(beginNode, isReverse = true) {
|
|
909
899
|
// TODO to support get path through passing key
|
|
910
900
|
const result = [];
|
|
911
|
-
|
|
912
|
-
if (!
|
|
901
|
+
let beginNodeEnsured = this.ensureNode(beginNode);
|
|
902
|
+
if (!beginNodeEnsured)
|
|
913
903
|
return result;
|
|
914
|
-
while (
|
|
904
|
+
while (beginNodeEnsured.parent) {
|
|
915
905
|
// Array.push + Array.reverse is more efficient than Array.unshift
|
|
916
906
|
// TODO may consider using Deque, so far this is not the performance bottleneck
|
|
917
|
-
result.push(
|
|
918
|
-
|
|
907
|
+
result.push(beginNodeEnsured);
|
|
908
|
+
beginNodeEnsured = beginNodeEnsured.parent;
|
|
919
909
|
}
|
|
920
|
-
result.push(
|
|
910
|
+
result.push(beginNodeEnsured);
|
|
921
911
|
return isReverse ? result.reverse() : result;
|
|
922
912
|
}
|
|
923
913
|
/**
|
|
@@ -1563,10 +1553,10 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
1563
1553
|
console.log(`U for undefined
|
|
1564
1554
|
`);
|
|
1565
1555
|
if (opts.isShowNull)
|
|
1566
|
-
console.log(`
|
|
1556
|
+
console.log(`N for null
|
|
1567
1557
|
`);
|
|
1568
1558
|
if (opts.isShowRedBlackNIL)
|
|
1569
|
-
console.log(`S for Sentinel Node
|
|
1559
|
+
console.log(`S for Sentinel Node(NIL)
|
|
1570
1560
|
`);
|
|
1571
1561
|
const display = (root) => {
|
|
1572
1562
|
const [lines, , ,] = this._displayAux(root, opts);
|
|
@@ -1592,23 +1582,23 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
1592
1582
|
const stack = [];
|
|
1593
1583
|
let current = node;
|
|
1594
1584
|
while (current || stack.length > 0) {
|
|
1595
|
-
while (
|
|
1585
|
+
while (this.isRealNode(current)) {
|
|
1596
1586
|
stack.push(current);
|
|
1597
1587
|
current = current.left;
|
|
1598
1588
|
}
|
|
1599
1589
|
current = stack.pop();
|
|
1600
|
-
if (
|
|
1590
|
+
if (this.isRealNode(current)) {
|
|
1601
1591
|
yield [current.key, current.value];
|
|
1602
1592
|
current = current.right;
|
|
1603
1593
|
}
|
|
1604
1594
|
}
|
|
1605
1595
|
}
|
|
1606
1596
|
else {
|
|
1607
|
-
if (node.left &&
|
|
1597
|
+
if (node.left && this.isRealNode(node)) {
|
|
1608
1598
|
yield* this[Symbol.iterator](node.left);
|
|
1609
1599
|
}
|
|
1610
1600
|
yield [node.key, node.value];
|
|
1611
|
-
if (node.right &&
|
|
1601
|
+
if (node.right && this.isRealNode(node)) {
|
|
1612
1602
|
yield* this[Symbol.iterator](node.right);
|
|
1613
1603
|
}
|
|
1614
1604
|
}
|
|
@@ -1637,12 +1627,12 @@ class BinaryTree extends base_1.IterableEntryBase {
|
|
|
1637
1627
|
else if (node === undefined && !isShowUndefined) {
|
|
1638
1628
|
return emptyDisplayLayout;
|
|
1639
1629
|
}
|
|
1640
|
-
else if (
|
|
1630
|
+
else if (this.isNIL(node) && !isShowRedBlackNIL) {
|
|
1641
1631
|
return emptyDisplayLayout;
|
|
1642
1632
|
}
|
|
1643
1633
|
else if (node !== null && node !== undefined) {
|
|
1644
1634
|
// Display logic of normal nodes
|
|
1645
|
-
const key = node.key, line =
|
|
1635
|
+
const key = node.key, line = this.isNIL(node) ? 'S' : key.toString(), width = line.length;
|
|
1646
1636
|
return _buildNodeDisplay(line, width, this._displayAux(node.left, options), this._displayAux(node.right, options));
|
|
1647
1637
|
}
|
|
1648
1638
|
else {
|