data-structure-typed 1.39.0 → 1.39.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.
- package/CHANGELOG.md +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +8 -8
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/cjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/cjs/data-structures/matrix/matrix2d.js.map +1 -1
- package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/cjs/types/helpers.d.ts +1 -4
- package/dist/cjs/types/helpers.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +8 -8
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/mjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -1
- package/dist/mjs/data-structures/graph/abstract-graph.js +1 -1
- package/dist/mjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/mjs/data-structures/graph/map-graph.js +1 -1
- package/dist/mjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/mjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/mjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/mjs/types/helpers.d.ts +1 -4
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +5 -5
- package/src/data-structures/binary-tree/avl-tree.ts +5 -4
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +37 -93
- package/src/data-structures/binary-tree/bst.ts +11 -17
- package/src/data-structures/binary-tree/rb-tree.ts +2 -1
- package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
- package/src/data-structures/graph/abstract-graph.ts +12 -11
- package/src/data-structures/graph/directed-graph.ts +2 -1
- package/src/data-structures/graph/map-graph.ts +2 -2
- package/src/data-structures/graph/undirected-graph.ts +5 -4
- package/src/data-structures/hash/hash-map.ts +1 -1
- package/src/data-structures/hash/tree-map.ts +1 -2
- package/src/data-structures/hash/tree-set.ts +1 -2
- package/src/data-structures/heap/heap.ts +2 -2
- package/src/data-structures/heap/max-heap.ts +1 -1
- package/src/data-structures/heap/min-heap.ts +1 -1
- package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
- package/src/data-structures/matrix/matrix.ts +1 -1
- package/src/data-structures/matrix/matrix2d.ts +1 -3
- package/src/data-structures/matrix/vector2d.ts +1 -4
- package/src/data-structures/priority-queue/max-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/min-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/priority-queue.ts +1 -1
- package/src/data-structures/queue/deque.ts +4 -5
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/interfaces/binary-tree.ts +2 -2
- package/src/types/data-structures/binary-tree/binary-tree.ts +0 -4
- package/src/types/data-structures/matrix/navigator.ts +1 -1
- package/src/types/helpers.ts +1 -7
- package/src/types/utils/utils.ts +1 -1
- package/src/types/utils/validate-type.ts +2 -2
- package/test/integration/bst.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +142 -2
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +270 -48
- package/test/unit/data-structures/binary-tree/bst.test.ts +394 -4
- package/test/unit/data-structures/binary-tree/overall.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +73 -7
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +242 -187
- package/test/unit/data-structures/graph/directed-graph.test.ts +34 -4
- package/test/unit/data-structures/graph/map-graph.test.ts +82 -1
- package/test/unit/data-structures/graph/undirected-graph.test.ts +82 -0
- package/test/unit/data-structures/heap/heap.test.ts +2 -2
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +1 -1
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +3 -3
- package/test/unit/data-structures/matrix/matrix2d.test.ts +207 -0
- package/test/unit/data-structures/matrix/navigator.test.ts +166 -1
- package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +2 -2
- package/test/unit/data-structures/queue/deque.test.ts +264 -1
- package/test/unit/data-structures/queue/queue.test.ts +3 -1
- package/test/utils/big-o.ts +1 -1
|
@@ -11,7 +11,7 @@ import type {Comparator} from '../../types';
|
|
|
11
11
|
|
|
12
12
|
export class MaxHeap<E = any> extends Heap<E> {
|
|
13
13
|
constructor(
|
|
14
|
-
options: {
|
|
14
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
15
15
|
comparator: (a: E, b: E) => {
|
|
16
16
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
17
17
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -11,7 +11,7 @@ import type {Comparator} from '../../types';
|
|
|
11
11
|
|
|
12
12
|
export class MinHeap<E = any> extends Heap<E> {
|
|
13
13
|
constructor(
|
|
14
|
-
options: {
|
|
14
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
15
15
|
comparator: (a: E, b: E) => {
|
|
16
16
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
17
17
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -14,7 +14,7 @@ export class MatrixNTI2D<V = any> {
|
|
|
14
14
|
* given initial value or 0 if not provided.
|
|
15
15
|
* @param options - An object containing the following properties:
|
|
16
16
|
*/
|
|
17
|
-
constructor(options: {
|
|
17
|
+
constructor(options: {row: number; col: number; initialVal?: V}) {
|
|
18
18
|
const {row, col, initialVal} = options;
|
|
19
19
|
this._matrix = new Array(row).fill(undefined).map(() => new Array(col).fill(initialVal || 0));
|
|
20
20
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
|
-
import Vector2D from './vector2d';
|
|
8
|
+
import {Vector2D} from './vector2d';
|
|
9
9
|
|
|
10
10
|
export class Matrix2D {
|
|
11
11
|
private readonly _matrix: number[][];
|
|
@@ -209,5 +209,3 @@ export class Matrix2D {
|
|
|
209
209
|
return new Vector2D(this._matrix[0][0], this._matrix[1][0]);
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
|
-
|
|
213
|
-
export default Matrix2D;
|
|
@@ -10,8 +10,7 @@ export class Vector2D {
|
|
|
10
10
|
public x: number = 0,
|
|
11
11
|
public y: number = 0,
|
|
12
12
|
public w: number = 1 // needed for matrix multiplication
|
|
13
|
-
) {
|
|
14
|
-
}
|
|
13
|
+
) {}
|
|
15
14
|
|
|
16
15
|
/**
|
|
17
16
|
* The function checks if the x and y values of a point are both zero.
|
|
@@ -313,5 +312,3 @@ export class Vector2D {
|
|
|
313
312
|
this.y = 0;
|
|
314
313
|
}
|
|
315
314
|
}
|
|
316
|
-
|
|
317
|
-
export default Vector2D;
|
|
@@ -10,7 +10,7 @@ import type {Comparator} from '../../types';
|
|
|
10
10
|
|
|
11
11
|
export class MaxPriorityQueue<E = any> extends PriorityQueue<E> {
|
|
12
12
|
constructor(
|
|
13
|
-
options: {
|
|
13
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
14
14
|
comparator: (a: E, b: E) => {
|
|
15
15
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
16
16
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -10,7 +10,7 @@ import type {Comparator} from '../../types';
|
|
|
10
10
|
|
|
11
11
|
export class MinPriorityQueue<E = any> extends PriorityQueue<E> {
|
|
12
12
|
constructor(
|
|
13
|
-
options: {
|
|
13
|
+
options: {comparator: Comparator<E>; nodes?: E[]} = {
|
|
14
14
|
comparator: (a: E, b: E) => {
|
|
15
15
|
if (!(typeof a === 'number' && typeof b === 'number')) {
|
|
16
16
|
throw new Error('The a, b params of compare function must be number');
|
|
@@ -10,7 +10,7 @@ import {Heap} from '../heap';
|
|
|
10
10
|
import {Comparator} from '../../types';
|
|
11
11
|
|
|
12
12
|
export class PriorityQueue<E = any> extends Heap<E> {
|
|
13
|
-
constructor(options: {
|
|
13
|
+
constructor(options: {comparator: Comparator<E>; nodes?: E[]}) {
|
|
14
14
|
super(options);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -9,8 +9,7 @@ import {DoublyLinkedList} from '../linked-list';
|
|
|
9
9
|
|
|
10
10
|
// O(n) time complexity of obtaining the value
|
|
11
11
|
// O(1) time complexity of adding at the beginning and the end
|
|
12
|
-
export class Deque<E = any> extends DoublyLinkedList<E> {
|
|
13
|
-
}
|
|
12
|
+
export class Deque<E = any> extends DoublyLinkedList<E> {}
|
|
14
13
|
|
|
15
14
|
// O(1) time complexity of obtaining the value
|
|
16
15
|
// O(n) time complexity of adding at the beginning and the end
|
|
@@ -20,9 +19,9 @@ export class ObjectDeque<E = number> {
|
|
|
20
19
|
if (capacity !== undefined) this._capacity = capacity;
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
private _nodes: {
|
|
22
|
+
private _nodes: {[key: number]: E} = {};
|
|
24
23
|
|
|
25
|
-
get nodes(): {
|
|
24
|
+
get nodes(): {[p: number]: E} {
|
|
26
25
|
return this._nodes;
|
|
27
26
|
}
|
|
28
27
|
|
|
@@ -157,7 +156,7 @@ export class ObjectDeque<E = number> {
|
|
|
157
156
|
return this._size <= 0;
|
|
158
157
|
}
|
|
159
158
|
|
|
160
|
-
protected _seNodes(value: {
|
|
159
|
+
protected _seNodes(value: {[p: number]: E}) {
|
|
161
160
|
this._nodes = value;
|
|
162
161
|
}
|
|
163
162
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {BinaryTreeNode} from '../data-structures';
|
|
2
|
-
import {BinaryTreeDeletedResult, BinaryTreeNodeKey, BinaryTreeNodeNested,
|
|
2
|
+
import {BinaryTreeDeletedResult, BinaryTreeNodeKey, BinaryTreeNodeNested, OneParamCallback} from '../types';
|
|
3
3
|
|
|
4
4
|
export interface IBinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNodeNested<V>> {
|
|
5
5
|
createNode(key: BinaryTreeNodeKey, val?: N['val']): N;
|
|
6
6
|
|
|
7
7
|
add(keyOrNode: BinaryTreeNodeKey | N | null, val?: N['val']): N | null | undefined;
|
|
8
8
|
|
|
9
|
-
delete<C extends
|
|
9
|
+
delete<C extends OneParamCallback<N>>(identifier: ReturnType<C> | null, callback: C): BinaryTreeDeletedResult<N>[];
|
|
10
10
|
}
|
|
@@ -24,10 +24,6 @@ export enum FamilyPosition {
|
|
|
24
24
|
|
|
25
25
|
export type BinaryTreeNodeKey = number;
|
|
26
26
|
|
|
27
|
-
export type BFSCallback<N, D = any> = (node: N, level?: number) => D;
|
|
28
|
-
|
|
29
|
-
export type BFSCallbackReturn<N> = ReturnType<BFSCallback<N>>;
|
|
30
|
-
|
|
31
27
|
export type BinaryTreeDeletedResult<N> = { deleted: N | null | undefined; needBalanced: N | null };
|
|
32
28
|
|
|
33
29
|
export type BinaryTreeNodeNested<T> = BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
package/src/types/helpers.ts
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import {BinaryTreeNodeKey} from './data-structures';
|
|
2
|
-
|
|
3
1
|
export type Comparator<T> = (a: T, b: T) => number;
|
|
4
2
|
|
|
5
3
|
export type DFSOrderPattern = 'pre' | 'in' | 'post';
|
|
6
4
|
|
|
7
|
-
export type
|
|
8
|
-
|
|
9
|
-
export type DefaultMapCallback<N, D = BinaryTreeNodeKey> = (node: N) => D;
|
|
10
|
-
|
|
11
|
-
export type MapCallbackReturn<N> = ReturnType<MapCallback<N>>;
|
|
5
|
+
export type OneParamCallback<N, D = any> = (node: N) => D;
|
|
12
6
|
|
|
13
7
|
export enum CP {
|
|
14
8
|
lt = 'lt',
|
package/src/types/utils/utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type ToThunkFn = () => ReturnType<TrlFn>;
|
|
2
|
-
export type Thunk = () => ReturnType<ToThunkFn> & {
|
|
2
|
+
export type Thunk = () => ReturnType<ToThunkFn> & {__THUNK__: symbol};
|
|
3
3
|
export type TrlFn = (...args: any[]) => any;
|
|
4
4
|
export type TrlAsyncFn = (...args: any[]) => any;
|
|
5
5
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export type KeyValueObject = {
|
|
1
|
+
export type KeyValueObject = {[key: string]: any};
|
|
2
2
|
|
|
3
|
-
export type KeyValueObjectWithKey = {
|
|
3
|
+
export type KeyValueObjectWithKey = {[key: string]: any; key: string | number | symbol};
|
|
4
4
|
|
|
5
5
|
export type NonNumberNonObjectButDefined = string | boolean | symbol | null;
|
|
6
6
|
|
|
@@ -183,7 +183,7 @@ describe('Individual package BST operations test', () => {
|
|
|
183
183
|
});
|
|
184
184
|
|
|
185
185
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
186
|
-
const objBST = new BST<{
|
|
186
|
+
const objBST = new BST<{key: number; keyA: number}>();
|
|
187
187
|
expect(objBST).toBeInstanceOf(BST);
|
|
188
188
|
objBST.add(11, {key: 11, keyA: 11});
|
|
189
189
|
objBST.add(3, {key: 3, keyA: 3});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {AVLTree, AVLTreeNode, CP} from '../../../../src';
|
|
1
|
+
import {AVLTree, AVLTreeNode, CP, IterationType} from '../../../../src';
|
|
2
2
|
|
|
3
3
|
describe('AVL Tree Test', () => {
|
|
4
4
|
it('should perform various operations on a AVL Tree', () => {
|
|
@@ -109,8 +109,117 @@ describe('AVL Tree Test', () => {
|
|
|
109
109
|
});
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
+
describe('AVL Tree Test recursively', () => {
|
|
113
|
+
it('should perform various operations on a AVL Tree', () => {
|
|
114
|
+
const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
115
|
+
const tree = new AVLTree<number>({iterationType: IterationType.RECURSIVE});
|
|
116
|
+
|
|
117
|
+
for (const i of arr) tree.add(i, i);
|
|
118
|
+
|
|
119
|
+
const node6 = tree.get(6);
|
|
120
|
+
|
|
121
|
+
expect(node6 && tree.getHeight(node6)).toBe(3);
|
|
122
|
+
expect(node6 && tree.getDepth(node6)).toBe(1);
|
|
123
|
+
|
|
124
|
+
const getNodeById = tree.get(10);
|
|
125
|
+
expect(getNodeById?.key).toBe(10);
|
|
126
|
+
|
|
127
|
+
const getMinNodeByRoot = tree.getLeftMost();
|
|
128
|
+
expect(getMinNodeByRoot?.key).toBe(1);
|
|
129
|
+
|
|
130
|
+
const node15 = tree.get(15);
|
|
131
|
+
const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
|
|
132
|
+
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
133
|
+
|
|
134
|
+
let subTreeSum = 0;
|
|
135
|
+
node15 && tree.subTreeTraverse(node => (subTreeSum += node.key), node15);
|
|
136
|
+
expect(subTreeSum).toBe(70);
|
|
137
|
+
|
|
138
|
+
let lesserSum = 0;
|
|
139
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
|
|
140
|
+
expect(lesserSum).toBe(45);
|
|
141
|
+
|
|
142
|
+
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
143
|
+
expect(node15?.val).toBe(15);
|
|
144
|
+
|
|
145
|
+
const dfs = tree.dfs(node => node, 'in');
|
|
146
|
+
expect(dfs[0].key).toBe(1);
|
|
147
|
+
expect(dfs[dfs.length - 1].key).toBe(16);
|
|
148
|
+
|
|
149
|
+
tree.perfectlyBalance();
|
|
150
|
+
const bfs = tree.bfs(node => node);
|
|
151
|
+
expect(tree.isPerfectlyBalanced()).toBe(true);
|
|
152
|
+
expect(bfs[0].key).toBe(8);
|
|
153
|
+
expect(bfs[bfs.length - 1].key).toBe(16);
|
|
154
|
+
|
|
155
|
+
expect(tree.delete(11)[0].deleted?.key).toBe(11);
|
|
156
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
157
|
+
expect(node15 && tree.getHeight(node15)).toBe(2);
|
|
158
|
+
|
|
159
|
+
expect(tree.delete(1)[0].deleted?.key).toBe(1);
|
|
160
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
161
|
+
expect(tree.getHeight()).toBe(4);
|
|
162
|
+
|
|
163
|
+
expect(tree.delete(4)[0].deleted?.key).toBe(4);
|
|
164
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
165
|
+
expect(tree.getHeight()).toBe(4);
|
|
166
|
+
|
|
167
|
+
expect(tree.delete(10)[0].deleted?.key).toBe(10);
|
|
168
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
169
|
+
expect(tree.getHeight()).toBe(3);
|
|
170
|
+
|
|
171
|
+
expect(tree.delete(15)[0].deleted?.key).toBe(15);
|
|
172
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
173
|
+
|
|
174
|
+
expect(tree.getHeight()).toBe(3);
|
|
175
|
+
|
|
176
|
+
expect(tree.delete(5)[0].deleted?.key).toBe(5);
|
|
177
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
178
|
+
expect(tree.getHeight()).toBe(3);
|
|
179
|
+
|
|
180
|
+
expect(tree.delete(13)[0].deleted?.key).toBe(13);
|
|
181
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
182
|
+
expect(tree.getHeight()).toBe(3);
|
|
183
|
+
|
|
184
|
+
expect(tree.delete(3)[0].deleted?.key).toBe(3);
|
|
185
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
186
|
+
expect(tree.getHeight()).toBe(3);
|
|
187
|
+
|
|
188
|
+
expect(tree.delete(8)[0].deleted?.key).toBe(8);
|
|
189
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
190
|
+
expect(tree.getHeight()).toBe(3);
|
|
191
|
+
|
|
192
|
+
expect(tree.delete(6)[0].deleted?.key).toBe(6);
|
|
193
|
+
expect(tree.delete(6).length).toBe(0);
|
|
194
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
195
|
+
expect(tree.getHeight()).toBe(2);
|
|
196
|
+
|
|
197
|
+
expect(tree.delete(7)[0].deleted?.key).toBe(7);
|
|
198
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
199
|
+
expect(tree.getHeight()).toBe(2);
|
|
200
|
+
|
|
201
|
+
expect(tree.delete(9)[0].deleted?.key).toBe(9);
|
|
202
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
203
|
+
expect(tree.getHeight()).toBe(2);
|
|
204
|
+
expect(tree.delete(14)[0].deleted?.key).toBe(14);
|
|
205
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
206
|
+
expect(tree.getHeight()).toBe(1);
|
|
207
|
+
|
|
208
|
+
expect(tree.isAVLBalanced()).toBe(true);
|
|
209
|
+
const lastBFSIds = tree.bfs();
|
|
210
|
+
expect(lastBFSIds[0]).toBe(12);
|
|
211
|
+
expect(lastBFSIds[1]).toBe(2);
|
|
212
|
+
expect(lastBFSIds[2]).toBe(16);
|
|
213
|
+
|
|
214
|
+
const lastBFSNodes = tree.bfs(node => node);
|
|
215
|
+
expect(lastBFSNodes[0].key).toBe(12);
|
|
216
|
+
expect(lastBFSNodes[1].key).toBe(2);
|
|
217
|
+
expect(lastBFSNodes[2].key).toBe(16);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
112
221
|
describe('AVLTree APIs test', () => {
|
|
113
|
-
const avl = new AVLTree<{
|
|
222
|
+
const avl = new AVLTree<{id: number; text: string}>();
|
|
114
223
|
beforeEach(() => {
|
|
115
224
|
avl.clear();
|
|
116
225
|
});
|
|
@@ -127,3 +236,34 @@ describe('AVLTree APIs test', () => {
|
|
|
127
236
|
expect(bfsRes[0]).toBe(2);
|
|
128
237
|
});
|
|
129
238
|
});
|
|
239
|
+
|
|
240
|
+
describe('AVLTree', () => {
|
|
241
|
+
it('should balance the tree using _balanceLR when nodes are added', () => {
|
|
242
|
+
const avlTree = new AVLTree();
|
|
243
|
+
avlTree.add(10, 'A');
|
|
244
|
+
avlTree.add(5, 'B');
|
|
245
|
+
avlTree.add(15, 'C');
|
|
246
|
+
avlTree.add(3, 'D');
|
|
247
|
+
avlTree.add(7, 'E');
|
|
248
|
+
|
|
249
|
+
// Adding nodes to trigger _balanceLR
|
|
250
|
+
avlTree.add(12, 'F');
|
|
251
|
+
|
|
252
|
+
// You can add more specific assertions to check the tree's balance and structure.
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('should balance the tree using _balanceLR when nodes are deleted', () => {
|
|
256
|
+
const avlTree = new AVLTree();
|
|
257
|
+
avlTree.add(10, 'A');
|
|
258
|
+
avlTree.add(5, 'B');
|
|
259
|
+
avlTree.add(15, 'C');
|
|
260
|
+
avlTree.add(3, 'D');
|
|
261
|
+
avlTree.add(7, 'E');
|
|
262
|
+
avlTree.add(12, 'F');
|
|
263
|
+
|
|
264
|
+
// Deleting nodes to trigger _balanceLR
|
|
265
|
+
avlTree.delete(3);
|
|
266
|
+
|
|
267
|
+
// You can add more specific assertions to check the tree's balance and structure.
|
|
268
|
+
});
|
|
269
|
+
});
|