You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A high-performance, feature-rich AVL Tree (self-balancing binary search tree) implementation for JavaScript/TypeScript.
Sawit (Indonesian for "palm oil tree") provides a sorted set data structure with O(log n) operations, perfect for scenarios where you need fast insertion, deletion, and ordered queries.
✨ Features
🚀 O(log n) insert, delete, search, and order statistics
🎯 Order Statistics: kthSmallest, kthLargest, rank, select
📊 Range Queries: range, rangeCount, floor, ceiling
📦 Zero Dependencies: Pure TypeScript implementation
📘 Full TypeScript Support: Complete type definitions included
📦 Installation
npm install sawit.js
# or
yarn add sawit.js
# or
bun add sawit.js
🚀 Quick Start
import{SawitTree}from'sawit.js';// Create a treeconsttree=newSawitTree<number>();// Insert values (chainable)tree.insert(5).insert(3).insert(7).insert(1).insert(9);// Check existenceconsole.log(tree.has(5));// trueconsole.log(tree.size);// 5// Get min/maxconsole.log(tree.min());// 1console.log(tree.max());// 9// Iterate in sorted orderfor(constvalueoftree){console.log(value);// 1, 3, 5, 7, 9}// Convert to arrayconsole.log(tree.toArray());// [1, 3, 5, 7, 9]
📖 Usage Examples
Custom Comparator
// Objects with custom comparisoninterfaceUser{id: number;name: string;score: number;}constleaderboard=newSawitTree<User>((a,b)=>b.score-a.score);// Descendingleaderboard.insert({id: 1,name: 'Alice',score: 100});leaderboard.insert({id: 2,name: 'Bob',score: 150});leaderboard.insert({id: 3,name: 'Charlie',score: 120});// Get top playerconsttop=leaderboard.kthSmallest(1);console.log(top?.name);// 'Bob'
Range Queries
consttree=SawitTree.from([1,3,5,7,9,11,13,15]);// Get all values in range [5, 11]console.log(tree.range(5,11));// [5, 7, 9, 11]// Floor & Ceilingconsole.log(tree.floor(6));// 5 (largest ≤ 6)console.log(tree.ceiling(6));// 7 (smallest ≥ 6)// Count elements in rangeconsole.log(tree.rangeCount(5,11));// 4
Order Statistics
consttree=SawitTree.from([10,20,30,40,50]);// Rank: how many elements < valueconsole.log(tree.rank(30));// 2// Select: get element at rankconsole.log(tree.select(2));// 30// Kth smallest/largestconsole.log(tree.kthSmallest(2));// 20 (2nd smallest)console.log(tree.kthLargest(2));// 40 (2nd largest)
Functional Operations
constnumbers=SawitTree.from([1,2,3,4,5,6,7,8,9,10]);// Filter even numbersconstevens=numbers.filter(n=>n%2===0);console.log(evens.toArray());// [2, 4, 6, 8, 10]// Map to squaresconstsquares=numbers.map(n=>n*n);console.log(squares.toArray());// [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]// Reduce to sumconstsum=numbers.reduce((acc,n)=>acc+n,0);console.log(sum);// 55