@drozdik.m/avl-tree
Version:
Classic implementation of AVL tree with improvements like efficient search of nth item and iterator.
524 lines (523 loc) • 28.8 kB
JavaScript
exports.__esModule = true;
var unit_test_1 = require("@drozdik.m/unit-test");
var AVLTree_1 = require("../src/AVLTree");
var AVLTreeNode_1 = require("../src/AVLTreeNode");
//-----TESTING BEGIN-----
var unitTest = new unit_test_1.UnitTest("AVL Tree");
unitTest.AddTestCase("Rotations", function () {
var tree1 = new AVLTree_1.AVLTree();
tree1.root = new AVLTreeNode_1.AVLTreeNode(10);
tree1.root.right = new AVLTreeNode_1.AVLTreeNode(20);
tree1.root.right.right = new AVLTreeNode_1.AVLTreeNode(30);
tree1.root.right.right.Update();
tree1.root.right.Update();
tree1.root.Update();
unit_test_1.Assert.AreEqual(tree1.RotateLeft(tree1.root).value, 20);
unit_test_1.Assert.AreEqual(tree1.root.value, 20);
unit_test_1.Assert.AreEqual(tree1.root.left.value, 10);
unit_test_1.Assert.AreEqual(tree1.root.right.value, 30);
unit_test_1.Assert.AreEqual(tree1.root.left.parent.value, 20);
unit_test_1.Assert.AreEqual(tree1.root.right.parent.value, 20);
unit_test_1.Assert.IsNull(tree1.root.parent);
unit_test_1.Assert.IsNull(tree1.root.left.left);
unit_test_1.Assert.IsNull(tree1.root.left.right);
unit_test_1.Assert.IsNull(tree1.root.right.left);
unit_test_1.Assert.IsNull(tree1.root.right.right);
var tree2 = new AVLTree_1.AVLTree();
tree2.root = new AVLTreeNode_1.AVLTreeNode(10);
tree2.root.left = new AVLTreeNode_1.AVLTreeNode(5);
tree2.root.right = new AVLTreeNode_1.AVLTreeNode(15);
tree2.root.right.left = new AVLTreeNode_1.AVLTreeNode(12);
tree2.root.right.right = new AVLTreeNode_1.AVLTreeNode(20);
tree2.root.right.right.left = new AVLTreeNode_1.AVLTreeNode(18);
tree2.root.right.right.right = new AVLTreeNode_1.AVLTreeNode(25);
tree2.root.right.right.right.Update();
tree2.root.right.right.left.Update();
tree2.root.right.right.Update();
tree2.root.right.left.Update();
tree2.root.right.Update();
tree2.root.left.Update();
tree2.root.Update();
unit_test_1.Assert.AreEqual(tree2.RotateLeft(tree2.root.right).value, 20);
unit_test_1.Assert.AreEqual(tree2.root.value, 10);
unit_test_1.Assert.AreEqual(tree2.root.left.value, 5);
unit_test_1.Assert.AreEqual(tree2.root.right.value, 20);
unit_test_1.Assert.AreEqual(tree2.root.right.right.value, 25);
unit_test_1.Assert.AreEqual(tree2.root.right.left.value, 15);
unit_test_1.Assert.AreEqual(tree2.root.right.left.right.value, 18);
unit_test_1.Assert.AreEqual(tree2.root.right.left.left.value, 12);
unit_test_1.Assert.IsNull(tree2.root.parent);
unit_test_1.Assert.AreEqual(tree2.root.left.parent.value, 10);
unit_test_1.Assert.AreEqual(tree2.root.right.parent.value, 10);
unit_test_1.Assert.AreEqual(tree2.root.right.right.parent.value, 20);
unit_test_1.Assert.AreEqual(tree2.root.right.left.parent.value, 20);
unit_test_1.Assert.AreEqual(tree2.root.right.left.right.parent.value, 15);
unit_test_1.Assert.AreEqual(tree2.root.right.left.left.parent.value, 15);
unit_test_1.Assert.IsNull(tree2.root.left.left);
unit_test_1.Assert.IsNull(tree2.root.left.right);
unit_test_1.Assert.IsNull(tree2.root.right.right.right);
unit_test_1.Assert.IsNull(tree2.root.right.right.left);
unit_test_1.Assert.IsNull(tree2.root.right.left.left.right);
unit_test_1.Assert.IsNull(tree2.root.right.left.left.left);
unit_test_1.Assert.IsNull(tree2.root.right.left.right.right);
unit_test_1.Assert.IsNull(tree2.root.right.left.right.left);
unit_test_1.Assert.AreEqual(tree2.root.depth, 4);
unit_test_1.Assert.AreEqual(tree2.root.left.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.depth, 3);
unit_test_1.Assert.AreEqual(tree2.root.right.right.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.left.depth, 2);
unit_test_1.Assert.AreEqual(tree2.root.right.left.right.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.left.left.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.count, 7);
unit_test_1.Assert.AreEqual(tree2.root.left.count, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.count, 5);
unit_test_1.Assert.AreEqual(tree2.root.right.right.count, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.left.count, 3);
unit_test_1.Assert.AreEqual(tree2.root.right.left.right.count, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.left.left.count, 1);
unit_test_1.Assert.AreEqual(tree2.RotateRight(tree2.root.right).value, 15);
unit_test_1.Assert.AreEqual(tree2.root.value, 10);
unit_test_1.Assert.AreEqual(tree2.root.left.value, 5);
unit_test_1.Assert.AreEqual(tree2.root.right.value, 15);
unit_test_1.Assert.AreEqual(tree2.root.right.left.value, 12);
unit_test_1.Assert.AreEqual(tree2.root.right.right.value, 20);
unit_test_1.Assert.AreEqual(tree2.root.right.right.left.value, 18);
unit_test_1.Assert.AreEqual(tree2.root.right.right.right.value, 25);
unit_test_1.Assert.IsNull(tree2.root.left.left);
unit_test_1.Assert.IsNull(tree2.root.left.right);
unit_test_1.Assert.IsNull(tree2.root.right.left.left);
unit_test_1.Assert.IsNull(tree2.root.right.left.right);
unit_test_1.Assert.IsNull(tree2.root.right.right.left.left);
unit_test_1.Assert.IsNull(tree2.root.right.right.left.right);
unit_test_1.Assert.IsNull(tree2.root.right.right.right.left);
unit_test_1.Assert.IsNull(tree2.root.right.right.right.right);
unit_test_1.Assert.IsNull(tree2.root.parent);
unit_test_1.Assert.AreEqual(tree2.root.left.parent.value, 10);
unit_test_1.Assert.AreEqual(tree2.root.right.parent.value, 10);
unit_test_1.Assert.AreEqual(tree2.root.right.left.parent.value, 15);
unit_test_1.Assert.AreEqual(tree2.root.right.right.parent.value, 15);
unit_test_1.Assert.AreEqual(tree2.root.right.right.left.parent.value, 20);
unit_test_1.Assert.AreEqual(tree2.root.right.right.right.parent.value, 20);
unit_test_1.Assert.AreEqual(tree2.root.depth, 4);
unit_test_1.Assert.AreEqual(tree2.root.left.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.depth, 3);
unit_test_1.Assert.AreEqual(tree2.root.right.left.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.right.depth, 2);
unit_test_1.Assert.AreEqual(tree2.root.right.right.left.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.right.right.depth, 1);
unit_test_1.Assert.AreEqual(tree2.root.count, 7);
unit_test_1.Assert.AreEqual(tree2.root.left.count, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.count, 5);
unit_test_1.Assert.AreEqual(tree2.root.right.left.count, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.right.count, 3);
unit_test_1.Assert.AreEqual(tree2.root.right.right.left.count, 1);
unit_test_1.Assert.AreEqual(tree2.root.right.right.right.count, 1);
var tree3 = new AVLTree_1.AVLTree();
tree3.root = new AVLTreeNode_1.AVLTreeNode(10);
tree3.root.left = new AVLTreeNode_1.AVLTreeNode(5);
tree3.root.left.left = new AVLTreeNode_1.AVLTreeNode(3);
tree3.root.left.left.Update();
tree3.root.left.Update();
tree3.root.Update();
unit_test_1.Assert.AreEqual(tree3.RotateRight(tree3.root).value, 5);
unit_test_1.Assert.AreEqual(tree3.root.value, 5);
unit_test_1.Assert.AreEqual(tree3.root.left.value, 3);
unit_test_1.Assert.AreEqual(tree3.root.right.value, 10);
unit_test_1.Assert.AreEqual(tree3.root.left.parent.value, 5);
unit_test_1.Assert.AreEqual(tree3.root.right.parent.value, 5);
unit_test_1.Assert.IsNull(tree3.root.parent);
unit_test_1.Assert.IsNull(tree3.root.left.left);
unit_test_1.Assert.IsNull(tree3.root.left.right);
unit_test_1.Assert.IsNull(tree3.root.right.left);
unit_test_1.Assert.IsNull(tree3.root.right.right);
});
unitTest.AddTestCase("Double rotations", function () {
var tree4 = new AVLTree_1.AVLTree();
tree4.root = new AVLTreeNode_1.AVLTreeNode(10);
tree4.root.right = new AVLTreeNode_1.AVLTreeNode(15);
tree4.root.right.left = new AVLTreeNode_1.AVLTreeNode(12);
tree4.root.right.left.Update();
tree4.root.right.Update();
tree4.root.Update();
unit_test_1.Assert.AreEqual(tree4.RotateRightLeft(tree4.root).value, 12);
unit_test_1.Assert.AreEqual(tree4.root.value, 12);
unit_test_1.Assert.AreEqual(tree4.root.left.value, 10);
unit_test_1.Assert.AreEqual(tree4.root.right.value, 15);
unit_test_1.Assert.AreEqual(tree4.root.left.parent.value, 12);
unit_test_1.Assert.AreEqual(tree4.root.right.parent.value, 12);
unit_test_1.Assert.IsNull(tree4.root.parent);
unit_test_1.Assert.IsNull(tree4.root.left.left);
unit_test_1.Assert.IsNull(tree4.root.left.right);
unit_test_1.Assert.IsNull(tree4.root.right.left);
unit_test_1.Assert.IsNull(tree4.root.right.right);
var tree5 = new AVLTree_1.AVLTree();
tree5.root = new AVLTreeNode_1.AVLTreeNode(10);
tree5.root.left = new AVLTreeNode_1.AVLTreeNode(5);
tree5.root.left.right = new AVLTreeNode_1.AVLTreeNode(7);
tree5.root.left.right.Update();
tree5.root.left.Update();
tree5.root.Update();
unit_test_1.Assert.AreEqual(tree5.RotateLeftRight(tree5.root).value, 7);
unit_test_1.Assert.AreEqual(tree5.root.value, 7);
unit_test_1.Assert.AreEqual(tree5.root.left.value, 5);
unit_test_1.Assert.AreEqual(tree5.root.right.value, 10);
unit_test_1.Assert.AreEqual(tree5.root.left.parent.value, 7);
unit_test_1.Assert.AreEqual(tree5.root.right.parent.value, 7);
unit_test_1.Assert.IsNull(tree5.root.parent);
unit_test_1.Assert.IsNull(tree5.root.left.left);
unit_test_1.Assert.IsNull(tree5.root.left.right);
unit_test_1.Assert.IsNull(tree5.root.right.left);
unit_test_1.Assert.IsNull(tree5.root.right.right);
});
unitTest.AddTestCase("Insert", function () {
//Insert
var tree6 = new AVLTree_1.AVLTree();
tree6.Insert(20);
unit_test_1.Assert.AreEqual(tree6.root.value, 20);
unit_test_1.Assert.AreEqual(tree6.Count(), 1);
tree6.Insert(20);
unit_test_1.Assert.AreEqual(tree6.root.value, 20);
unit_test_1.Assert.IsNull(tree6.left);
unit_test_1.Assert.IsNull(tree6.right);
unit_test_1.Assert.AreEqual(tree6.Count(), 1);
tree6.Insert(30);
unit_test_1.Assert.AreEqual(tree6.root.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 30);
unit_test_1.Assert.AreEqual(tree6.Count(), 2);
tree6.Insert(40);
unit_test_1.Assert.AreEqual(tree6.root.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 40);
unit_test_1.Assert.AreEqual(tree6.Count(), 3);
tree6.Insert(50);
unit_test_1.Assert.AreEqual(tree6.root.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 40);
unit_test_1.Assert.AreEqual(tree6.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6.Count(), 4);
tree6.Insert(45);
unit_test_1.Assert.AreEqual(tree6.root.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6.root.right.left.value, 40);
unit_test_1.Assert.AreEqual(tree6.Count(), 5);
tree6.Insert(35);
unit_test_1.Assert.AreEqual(tree6.root.value, 40);
unit_test_1.Assert.AreEqual(tree6.root.left.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.left.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.left.right.value, 35);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6.Count(), 6);
tree6.Insert(10);
unit_test_1.Assert.AreEqual(tree6.root.value, 40);
unit_test_1.Assert.AreEqual(tree6.root.left.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.left.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.left.left.left.value, 10);
unit_test_1.Assert.AreEqual(tree6.root.left.right.value, 35);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6.Count(), 7);
tree6.Insert(0);
unit_test_1.Assert.AreEqual(tree6.root.value, 40);
unit_test_1.Assert.AreEqual(tree6.root.left.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.left.value, 10);
unit_test_1.Assert.AreEqual(tree6.root.left.left.left.value, 0);
unit_test_1.Assert.AreEqual(tree6.root.left.left.right.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.left.right.value, 35);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6.Count(), 8);
tree6.Insert(25);
unit_test_1.Assert.AreEqual(tree6.root.value, 40);
unit_test_1.Assert.AreEqual(tree6.root.left.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.left.left.value, 10);
unit_test_1.Assert.AreEqual(tree6.root.left.left.left.value, 0);
unit_test_1.Assert.AreEqual(tree6.root.left.right.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.right.left.value, 25);
unit_test_1.Assert.AreEqual(tree6.root.left.right.right.value, 35);
unit_test_1.Assert.AreEqual(tree6.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6.Count(), 9);
unit_test_1.Assert.IsNull(tree6.root.parent);
unit_test_1.Assert.AreEqual(tree6.root.left.parent.value, 40);
unit_test_1.Assert.AreEqual(tree6.root.right.parent.value, 40);
unit_test_1.Assert.AreEqual(tree6.root.left.left.parent.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.left.left.left.parent.value, 10);
unit_test_1.Assert.AreEqual(tree6.root.left.right.parent.value, 20);
unit_test_1.Assert.AreEqual(tree6.root.left.right.left.parent.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.left.right.right.parent.value, 30);
unit_test_1.Assert.AreEqual(tree6.root.right.right.parent.value, 45);
unit_test_1.Assert.AreEqual(tree6.root.sign, -1);
unit_test_1.Assert.AreEqual(tree6.root.left.sign, 0);
unit_test_1.Assert.AreEqual(tree6.root.left.left.sign, -1);
unit_test_1.Assert.AreEqual(tree6.root.left.left.left.sign, 0);
unit_test_1.Assert.AreEqual(tree6.root.left.right.sign, 0);
unit_test_1.Assert.AreEqual(tree6.root.left.right.left.sign, 0);
unit_test_1.Assert.AreEqual(tree6.root.left.right.right.sign, 0);
unit_test_1.Assert.AreEqual(tree6.root.right.sign, 1);
unit_test_1.Assert.AreEqual(tree6.root.right.right.sign, 0);
unit_test_1.Assert.AreEqual(tree6.root.count, 9);
unit_test_1.Assert.AreEqual(tree6.root.left.count, 6);
unit_test_1.Assert.AreEqual(tree6.root.left.left.count, 2);
unit_test_1.Assert.AreEqual(tree6.root.left.left.left.count, 1);
unit_test_1.Assert.AreEqual(tree6.root.left.right.count, 3);
unit_test_1.Assert.AreEqual(tree6.root.left.right.left.count, 1);
unit_test_1.Assert.AreEqual(tree6.root.left.right.right.count, 1);
unit_test_1.Assert.AreEqual(tree6.root.right.count, 2);
unit_test_1.Assert.AreEqual(tree6.root.right.right.count, 1);
unit_test_1.Assert.AreEqual(tree6.root.depth, 4);
unit_test_1.Assert.AreEqual(tree6.root.left.depth, 3);
unit_test_1.Assert.AreEqual(tree6.root.left.left.depth, 2);
unit_test_1.Assert.AreEqual(tree6.root.left.left.left.depth, 1);
unit_test_1.Assert.AreEqual(tree6.root.left.right.depth, 2);
unit_test_1.Assert.AreEqual(tree6.root.left.right.left.depth, 1);
unit_test_1.Assert.AreEqual(tree6.root.left.right.right.depth, 1);
unit_test_1.Assert.AreEqual(tree6.root.right.depth, 2);
unit_test_1.Assert.AreEqual(tree6.root.right.right.depth, 1);
});
unitTest.AddTestCase("Find", function () {
var tree11 = new AVLTree_1.AVLTree();
var valuesArray = [40, 10, 20, 80, 90, 50, 60, 70, 0, 30, 15, 45, 85, 5];
for (var i = 0; i < valuesArray.length; i++)
tree11.Insert(valuesArray[i]);
for (var i = 0; i < valuesArray.length; i++)
unit_test_1.Assert.AreEqual(tree11.Find(valuesArray[i]).Value(), valuesArray[i]);
unit_test_1.Assert.IsFalse(tree11.Find(999).HasValue());
var bst4 = new AVLTree_1.AVLTree();
unit_test_1.Assert.IsFalse(bst4.FindMin().HasValue());
unit_test_1.Assert.IsFalse(bst4.FindMax().HasValue());
unit_test_1.Assert.IsFalse(bst4.Find(1).HasValue());
unit_test_1.Assert.IsFalse(bst4.First().HasValue());
unit_test_1.Assert.IsFalse(bst4.Last().HasValue());
bst4.Insert(1);
unit_test_1.Assert.AreEqual(bst4.First().Value(), 1);
unit_test_1.Assert.AreEqual(bst4.Last().Value(), 1);
});
unitTest.AddTestCase("Iterator", function () {
//Iterator - next, prev, value, hasvalue
var tree11 = new AVLTree_1.AVLTree();
var valuesArray = [40, 10, 20, 80, 90, 50, 60, 70, 0, 30, 15, 45, 85, 5];
for (var i = 0; i < valuesArray.length; i++)
tree11.Insert(valuesArray[i]);
valuesArray = valuesArray.sort(function (a, b) { return a - b; });
var number = 0;
for (var it = tree11.First(); it.HasValue(); it.Next())
unit_test_1.Assert.AreEqual(it.Value(), valuesArray[number++]);
unit_test_1.Assert.AreEqual(valuesArray.length, number);
number = valuesArray.length - 1;
for (var it = tree11.Last(); it.HasValue(); it.Previous())
unit_test_1.Assert.AreEqual(it.Value(), valuesArray[number--]);
unit_test_1.Assert.AreEqual(-1, number);
});
unitTest.AddTestCase("Remove", function () {
var tree6Clone = new AVLTree_1.AVLTree();
tree6Clone.Insert(20);
tree6Clone.Insert(20);
tree6Clone.Insert(30);
tree6Clone.Insert(40);
tree6Clone.Insert(50);
tree6Clone.Insert(45);
tree6Clone.Insert(35);
tree6Clone.Insert(10);
tree6Clone.Insert(0);
tree6Clone.Insert(25);
tree6Clone.Remove(25);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 20);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.left.value, 10);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.left.left.value, 0);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.right.value, 30);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.right.right.value, 35);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 8);
tree6Clone.Remove(30);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 20);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.left.value, 10);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.left.left.value, 0);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.right.value, 35);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 7);
tree6Clone.Remove(35);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 10);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.left.value, 0);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.right.value, 20);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 6);
tree6Clone.Remove(0);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 10);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.right.value, 20);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.right.value, 50);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 5);
tree6Clone.Remove(50);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 10);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.right.value, 20);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 45);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 4);
tree6Clone.Remove(45);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 20);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 10);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 3);
tree6Clone.Remove(20);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 10);
unit_test_1.Assert.IsNull(tree6Clone.root.right);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 2);
tree6Clone.Remove(20);
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 10);
unit_test_1.Assert.IsNull(tree6Clone.root.right);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 2);
tree6Clone.Remove(999);
tree6Clone.RemoveAt(tree6Clone.Find(999));
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 40);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 10);
unit_test_1.Assert.IsNull(tree6Clone.root.right);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 2);
tree6Clone.RemoveAt(tree6Clone.Find(40));
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 10);
unit_test_1.Assert.IsNull(tree6Clone.root.right);
unit_test_1.Assert.IsNull(tree6Clone.root.left);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 1);
tree6Clone.Remove(10);
unit_test_1.Assert.IsNull(tree6Clone.root);
unit_test_1.Assert.AreEqual(tree6Clone.Count(), 0);
tree6Clone.Insert(20);
tree6Clone.Insert(30);
tree6Clone.Insert(10);
tree6Clone.Insert(40);
tree6Clone.RemoveAt(tree6Clone.Find(10));
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 30);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 20);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 40);
tree6Clone.Insert(35);
tree6Clone.RemoveAt(tree6Clone.Find(20));
unit_test_1.Assert.AreEqual(tree6Clone.root.value, 35);
unit_test_1.Assert.AreEqual(tree6Clone.root.left.value, 30);
unit_test_1.Assert.AreEqual(tree6Clone.root.right.value, 40);
});
unitTest.AddTestCase("Clone", function () {
var tree7 = new AVLTree_1.AVLTree();
var valuesArray = [45, 85, 5, 60, 70, 80, 90, 10, 20, 30, 15, 40, 0, 55];
for (var i = 0; i < valuesArray.length; i++)
tree7.Insert(valuesArray[i]);
valuesArray = valuesArray.sort(function (a, b) { return a - b; });
var number = 0;
for (var it = tree7.First(); it.HasValue(); it.Next())
unit_test_1.Assert.AreEqual(it.Value(), valuesArray[number++]);
unit_test_1.Assert.AreEqual(valuesArray.length, number);
var tree8 = tree7.Clone();
for (var i = 0; i < valuesArray.length; i++)
tree7.UpdateAt(valuesArray[i] * 10, tree7.Find(valuesArray[i]));
number = 0;
for (var it = tree8.First(); it.HasValue(); it.Next())
unit_test_1.Assert.AreEqual(it.Value(), valuesArray[number++]);
unit_test_1.Assert.AreEqual(valuesArray.length, number);
unit_test_1.Assert.AreEqual(tree7.Count(), valuesArray.length);
unit_test_1.Assert.AreEqual(tree8.Count(), valuesArray.length);
tree7.Clear();
unit_test_1.Assert.AreEqual(tree7.Count(), 0);
unit_test_1.Assert.AreEqual(tree8.Count(), valuesArray.length);
number = 0;
for (var it = tree8.First(); it.HasValue(); it.Next())
unit_test_1.Assert.AreEqual(it.Value(), valuesArray[number++]);
unit_test_1.Assert.AreEqual(valuesArray.length, number);
});
unitTest.AddTestCase("Comparator, Clone", function () {
var FooCmp = /** @class */ (function () {
function FooCmp(n) {
this.number = n;
}
FooCmp.prototype.GetComparator = function () {
return function (a, b) {
return a.number - b.number;
};
};
FooCmp.prototype.Clone = function () {
return new FooCmp(this.number);
};
return FooCmp;
}());
var tree9 = new AVLTree_1.AVLTree([
new FooCmp(0),
new FooCmp(1),
new FooCmp(2),
new FooCmp(3),
new FooCmp(4)
]);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(0)).Value().number, 0);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(1)).Value().number, 1);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(2)).Value().number, 2);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(3)).Value().number, 3);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(4)).Value().number, 4);
var tree10 = tree9.Clone();
unit_test_1.Assert.AreEqual(tree10.Count(), 5);
unit_test_1.Assert.AreEqual(tree10.Find(new FooCmp(0)).Value().number, 0);
unit_test_1.Assert.AreEqual(tree10.Find(new FooCmp(1)).Value().number, 1);
unit_test_1.Assert.AreEqual(tree10.Find(new FooCmp(2)).Value().number, 2);
unit_test_1.Assert.AreEqual(tree10.Find(new FooCmp(3)).Value().number, 3);
unit_test_1.Assert.AreEqual(tree10.Find(new FooCmp(4)).Value().number, 4);
tree10.Find(new FooCmp(0)).Value().number = -1;
unit_test_1.Assert.AreEqual(tree10.Find(new FooCmp(-1)).Value().number, -1);
tree10.Dispose();
unit_test_1.Assert.IsFalse(tree9.Find(new FooCmp(-1)).HasValue());
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(0)).Value().number, 0);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(1)).Value().number, 1);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(2)).Value().number, 2);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(3)).Value().number, 3);
unit_test_1.Assert.AreEqual(tree9.Find(new FooCmp(4)).Value().number, 4);
});
unitTest.AddTestCase("Update", function () {
var tree12 = new AVLTree_1.AVLTree();
tree12.Update(10, 10);
var valuesArray = [40, 60, 70, 0, 30, 15, 45, 85, 5, 10, 20, 80, 90, 55];
tree12.Build(valuesArray);
for (var i = 0; i < valuesArray.length; i++)
tree12.Update(valuesArray[i], 0);
for (var i = 0; i < valuesArray.length; i++)
tree12.UpdateAt(0, tree12.Find(valuesArray[i]));
for (var i = 0; i < valuesArray.length; i++)
tree12.Update(valuesArray[i], 85);
for (var i = 0; i < valuesArray.length; i++)
tree12.UpdateAt(30, tree12.Find(valuesArray[i]));
valuesArray = valuesArray.sort(function (a, b) { return a - b; });
var number = 0;
for (var it = tree12.First(); it.HasValue(); it.Next())
unit_test_1.Assert.AreEqual(it.Value(), valuesArray[number++]);
unit_test_1.Assert.AreEqual(valuesArray.length, number);
for (var i = 0; i < valuesArray.length; i++)
tree12.UpdateAt(valuesArray[i] * 10, tree12.Find(valuesArray[i]));
tree12.Update(999, 9999);
tree12.UpdateAt(9999, tree12.Find(999));
for (var i = 0; i < valuesArray.length; i++)
tree12.Update(valuesArray[i] * 10, valuesArray[i] * 100);
number = 0;
for (var it = tree12.First(); it.HasValue(); it.Next())
unit_test_1.Assert.AreEqual(it.Value(), valuesArray[number++] * 100);
unit_test_1.Assert.AreEqual(valuesArray.length, number);
});
unitTest.AddTestCase("At", function () {
var tree13 = new AVLTree_1.AVLTree();
var valuesArray = [90, 10, 20, 30, 15, 40, 80, 0, 55, 45, 85, 5, 60, 70, 120, 100, 140, 180, 135];
tree13.Build(valuesArray);
valuesArray = valuesArray.sort(function (a, b) { return a - b; });
for (var i = 0; +i < valuesArray.length; i++)
unit_test_1.Assert.AreEqual(tree13.At(i), valuesArray[i]);
for (var i = 0; +i < valuesArray.length; i++)
unit_test_1.Assert.AreEqual(tree13.AtIterator(i).Value(), valuesArray[i]);
unit_test_1.Assert.IsFalse(tree13.AtIterator(-1).HasValue());
unit_test_1.Assert.IsFalse(tree13.AtIterator(valuesArray.length).HasValue());
unit_test_1.Assert.IsNull(tree13.At(-1));
unit_test_1.Assert.IsNull(tree13.At(valuesArray.length));
});
unitTest.Run();