red-black-tree-node
Version:
The algorithm of a self-balancing tree is used (Red-Black tree)
70 lines (69 loc) • 2.14 kB
JavaScript
;
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;