@foxglove/avl
Version:
Adelson-Velsky-Landis (AVL) self-balancing binary trees in TypeScript
134 lines • 3.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.printNodes = exports.prevNode = exports.nextNode = exports.rotateRight = exports.rotateLeft = void 0;
/**
* Single left rotation
*/
function rotateLeft(node) {
const rightNode = node.right;
node.right = rightNode.left;
if (rightNode.left) {
rightNode.left.parent = node;
}
rightNode.parent = node.parent;
if (rightNode.parent) {
if (rightNode.parent.left === node) {
rightNode.parent.left = rightNode;
}
else {
rightNode.parent.right = rightNode;
}
}
node.parent = rightNode;
rightNode.left = node;
node.balanceFactor += 1;
if (rightNode.balanceFactor < 0) {
node.balanceFactor -= rightNode.balanceFactor;
}
rightNode.balanceFactor += 1;
if (node.balanceFactor > 0) {
rightNode.balanceFactor += node.balanceFactor;
}
return rightNode;
}
exports.rotateLeft = rotateLeft;
/**
* Single right rotation
*/
function rotateRight(node) {
const leftNode = node.left;
node.left = leftNode.right;
if (node.left) {
node.left.parent = node;
}
leftNode.parent = node.parent;
if (leftNode.parent) {
if (leftNode.parent.left === node) {
leftNode.parent.left = leftNode;
}
else {
leftNode.parent.right = leftNode;
}
}
node.parent = leftNode;
leftNode.right = node;
node.balanceFactor -= 1;
if (leftNode.balanceFactor > 0) {
node.balanceFactor -= leftNode.balanceFactor;
}
leftNode.balanceFactor -= 1;
if (node.balanceFactor < 0) {
leftNode.balanceFactor += node.balanceFactor;
}
return leftNode;
}
exports.rotateRight = rotateRight;
/**
* Return the node immediately after the given node in the in-order traversal
*/
function nextNode(node) {
let curNode = node;
let successor = node;
if (successor.right) {
successor = successor.right;
while (successor.left) {
successor = successor.left;
}
}
else {
successor = curNode.parent;
while (successor && successor.right === curNode) {
curNode = successor;
successor = successor.parent;
}
}
return successor;
}
exports.nextNode = nextNode;
/**
* Return the node immediately before the given node in the in-order traversal
*/
function prevNode(node) {
let curNode = node;
let predecessor = node;
if (predecessor.left) {
predecessor = predecessor.left;
while (predecessor.right) {
predecessor = predecessor.right;
}
}
else {
predecessor = curNode.parent;
while (predecessor && predecessor.left === curNode) {
curNode = predecessor;
predecessor = predecessor.parent;
}
}
return predecessor;
}
exports.prevNode = prevNode;
/**
* Prints tree horizontally
*/
function printNodes(root, printEntry = (n) => String(n[0])) {
const out = [];
row(root, "", true, (v) => out.push(v), printEntry);
return out.join("");
}
exports.printNodes = printNodes;
/**
* Prints a level of the tree
*/
function row(root, prefix, isTail, callback, printEntry) {
if (root) {
callback(`${prefix}${isTail ? "└── " : "├── "}${printEntry([root.key, root.value])}\n`);
const indent = prefix + (isTail ? " " : "│ ");
if (root.left) {
row(root.left, indent, false, callback, printEntry);
}
if (root.right) {
row(root.right, indent, true, callback, printEntry);
}
}
}
//# sourceMappingURL=AVLNode.js.map