This is a standalone BST (Binary Search Tree) data structure from the data-structure-typed collection. If you wish to
access more data structures or advanced features, you can transition to directly installing the
complete data-structure-typed package
const bst =newBST<number>([11,3,15,1,8,13,16,2,6,9,12,14,4,7,10,5]);// Delete a leaf node
bst.delete(1);console.log(bst.has(1));// false;// Delete a node with one child
bst.delete(2);console.log(bst.has(2));// false;// Delete a node with two children
bst.delete(3);console.log(bst.has(3));// false;// Size decreases with each deletionconsole.log(bst.size);// 13;// Other nodes remain searchableconsole.log(bst.has(11));// true;console.log(bst.has(15));// true;
Merge 3 sorted datasets
const dataset1 =newBST<number,string>([[1,'A'],[7,'G']]);const dataset2 =[[2,'B'],[6,'F']];const dataset3 =newBST<number,string>([[3,'C'],[5,'E'],[4,'D']]);// Merge datasets into a single BinarySearchTreeconst merged =newBST<number,string>(dataset1);
merged.setMany(dataset2);
merged.merge(dataset3);// Verify merged dataset is in sorted orderconsole.log([...merged.values()]);// ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
BST with custom objects for expression evaluation
interfaceExpression{
id:number;
operator:string;
precedence:number;}// BST efficiently stores and retrieves operators by precedenceconst operatorTree =newBST<number, Expression>([[1,{ id:1, operator:'+', precedence:1}],[2,{ id:2, operator:'*', precedence:2}],[3,{ id:3, operator:'/', precedence:2}],[4,{ id:4, operator:'-', precedence:1}],[5,{ id:5, operator:'^', precedence:3}]],{ isMapMode:false});console.log(operatorTree.size);// 5;// Quick lookup of operatorsconst mult = operatorTree.get(2);console.log(mult?.operator);// '*';console.log(mult?.precedence);// 2;// Check if operator existsconsole.log(operatorTree.has(5));// true;console.log(operatorTree.has(99));// false;// Retrieve operator by precedence levelconst expNode = operatorTree.getNode(3);console.log(expNode?.key);// 3;console.log(expNode?.value?.precedence);// 2;// Delete operator and verify
operatorTree.delete(1);console.log(operatorTree.has(1));// false;console.log(operatorTree.size);// 4;// Get tree height for optimization analysisconst treeHeight = operatorTree.getHeight();console.log(treeHeight);// > 0;// Remaining operators are still accessibleconst remaining = operatorTree.get(2);console.log(remaining);// defined;
Find lowest common ancestor
const bst =newBST<number>([20,10,30,5,15,25,35,3,7,12,18]);// LCA helper functionconst findLCA =(num1:number, num2:number):number|undefined=>{const path1 = bst.getPathToRoot(num1);const path2 = bst.getPathToRoot(num2);// Find the first common ancestorreturnfindFirstCommon(path1, path2);};functionfindFirstCommon(arr1:(number|undefined)[], arr2:(number|undefined)[]):number|undefined{for(const num of arr1){if(arr2.indexOf(num)!==-1){return num;}}returnundefined;}// Assertionsconsole.log(findLCA(3,10));// 7;console.log(findLCA(5,35));// 15;console.log(findLCA(20,30));// 25;
Traverse a binary tree in a depth-first manner, starting from the root node, first visiting the left subtree,
and then the right subtree, using recursion.
Recursion + Iteration
Binary Tree BFS
Traverse a binary tree in a breadth-first manner, starting from the root node, visiting nodes level by level
from left to right.
Iteration
Binary Tree Morris
Morris traversal is an in-order traversal algorithm for binary trees with O(1) space complexity. It allows tree
traversal without additional stack or recursion.
Iteration
Software Engineering Design Standards
Principle
Description
Practicality
Follows ES6 and ESNext standards, offering unified and considerate optional parameters, and simplifies method names.
Extensibility
Adheres to OOP (Object-Oriented Programming) principles, allowing inheritance for all data structures.
Modularization
Includes data structure modularization and independent NPM packages.
Efficiency
All methods provide time and space complexity, comparable to native JS performance.
Maintainability
Follows open-source community development standards, complete documentation, continuous integration, and adheres to TDD (Test-Driven Development) patterns.
Testability
Automated and customized unit testing, performance testing, and integration testing.
Portability
Plans for porting to Java, Python, and C++, currently achieved to 80%.
Reusability
Fully decoupled, minimized side effects, and adheres to OOP.
Security
Carefully designed security for member variables and methods. Read-write separation. Data structure software does not need to consider other security aspects.
Scalability
Data structure software does not involve load issues.