data-structure-typed/test/integration/avl-tree.test.ts

111 lines
3.9 KiB
TypeScript
Raw Normal View History

2023-11-16 02:14:14 +00:00
import { AVLTree, CP } from 'avl-tree-typed';
describe('AVL Tree Test', () => {
2023-09-19 09:00:25 +00:00
it('should perform various operations on a AVL Tree', () => {
2023-11-27 05:59:26 +00:00
const arr: [number, number][] = [[11, 11], [3, 3], [15, 15], [1, 1], [8, 8], [13, 13], [16, 16], [2, 2], [6, 6], [9, 9], [12,12], [14, 14], [4, 4], [7, 7], [10,10], [5,5]];
2023-09-19 09:00:25 +00:00
const tree = new AVLTree();
2023-11-27 05:59:26 +00:00
for (const i of arr) tree.add(i);
2023-09-19 09:00:25 +00:00
const node6 = tree.get(6);
2023-09-19 09:00:25 +00:00
expect(node6 && tree.getHeight(node6)).toBe(3);
expect(node6 && tree.getDepth(node6)).toBe(1);
const getValueById = tree.get(10);
expect(getValueById).toBe(10);
2023-09-19 09:00:25 +00:00
const getMinNodeByRoot = tree.getLeftMost();
expect(getMinNodeByRoot?.key).toBe(1);
const node15 = tree.getNode(15);
2023-09-19 09:00:25 +00:00
const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
expect(getMinNodeBySpecificNode?.key).toBe(12);
let subTreeSum = 0;
node15 && tree.subTreeTraverse(node => (subTreeSum += node.key), 15);
2023-09-19 09:00:25 +00:00
expect(subTreeSum).toBe(70);
let lesserSum = 0;
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
2023-09-19 09:00:25 +00:00
expect(lesserSum).toBe(45);
2023-09-19 09:00:25 +00:00
// 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.
2023-10-31 03:22:21 +00:00
expect(node15?.value).toBe(15);
const dfs = tree.dfs(node => node, 'in');
expect(dfs[0].key).toBe(1);
expect(dfs[dfs.length - 1].key).toBe(16);
2023-09-19 09:00:25 +00:00
tree.perfectlyBalance();
const bfs = tree.bfs(node => node);
2023-09-19 09:00:25 +00:00
expect(tree.isPerfectlyBalanced()).toBe(true);
expect(bfs[0].key).toBe(8);
expect(bfs[bfs.length - 1].key).toBe(16);
expect(tree.delete(11)[0].deleted?.key).toBe(11);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(node15 && tree.getHeight(node15)).toBe(2);
expect(tree.delete(1)[0].deleted?.key).toBe(1);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(4);
expect(tree.delete(4)[0].deleted?.key).toBe(4);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(4);
expect(tree.delete(10)[0].deleted?.key).toBe(10);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(3);
expect(tree.delete(15)[0].deleted?.key).toBe(15);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
2023-09-19 09:00:25 +00:00
expect(tree.getHeight()).toBe(3);
expect(tree.delete(5)[0].deleted?.key).toBe(5);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(3);
expect(tree.delete(13)[0].deleted?.key).toBe(13);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(3);
expect(tree.delete(3)[0].deleted?.key).toBe(3);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(3);
expect(tree.delete(8)[0].deleted?.key).toBe(8);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(3);
expect(tree.delete(6)[0].deleted?.key).toBe(6);
expect(tree.delete(6).length).toBe(0);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(2);
expect(tree.delete(7)[0].deleted?.key).toBe(7);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(2);
expect(tree.delete(9)[0].deleted?.key).toBe(9);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(2);
expect(tree.delete(14)[0].deleted?.key).toBe(14);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
expect(tree.getHeight()).toBe(1);
2023-09-19 09:00:25 +00:00
expect(tree.isAVLBalanced()).toBe(true);
2023-10-11 15:36:10 +00:00
const lastBFSIds = tree.bfs();
2023-09-19 09:00:25 +00:00
expect(lastBFSIds[0]).toBe(12);
expect(lastBFSIds[1]).toBe(2);
expect(lastBFSIds[2]).toBe(16);
const lastBFSNodes = tree.bfs(node => node);
expect(lastBFSNodes[0].key).toBe(12);
expect(lastBFSNodes[1].key).toBe(2);
expect(lastBFSNodes[2].key).toBe(16);
2023-09-19 09:00:25 +00:00
});
});