UNPKG

red-black-tree-node

Version:

The algorithm of a self-balancing tree is used (Red-Black tree)

70 lines (69 loc) 2.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var node_1 = require("./node"); var RedBlackTree = /** @class */ (function () { function RedBlackTree(key, value) { if (!key) { this._root = null; } else { this._root = new node_1.Node(key, value); } } RedBlackTree.prototype.insert = function (key, value) { if (!this._root) { this._root = new node_1.Node(key, value); return; } var lastNode = this.findLastNode(key, true); var comparison = this.compare(key, lastNode.key); if (comparison < 0) { lastNode.left = new node_1.Node(key, value, node_1.Color.red); } else if (comparison > 0) { lastNode.right = new node_1.Node(key, value, node_1.Color.red); } else { lastNode.value = value; } lastNode.forwardBalancer(); }; RedBlackTree.prototype.find = function (key) { var node = this.findLastNode(key); return node && node.key === key && node.value || undefined; }; RedBlackTree.prototype.findLastNode = function (key, rebalance) { var previous = null; var node = this._root; while (node && !node.isLeaf) { var comparison = this.compare(key, node.key); previous = node; if (comparison < 0) { node = node.left; } else if (comparison > 0) { node = node.right; } else { if (rebalance) { node.forwardBalancer(); } return node; } } return node || previous; }; RedBlackTree.prototype.compare = function (fKey, sKey) { if (fKey < sKey) { return -1; } else if (fKey > sKey) { return 1; } else { return 0; } }; return RedBlackTree; }()); exports.RedBlackTree = RedBlackTree;