UNPKG

@drozdik.m/avl-tree

Version:

Classic implementation of AVL tree with improvements like efficient search of nth item and iterator.

639 lines (540 loc) 25.3 kB
import { UnitTest, Assert } from "@drozdik.m/unit-test"; import { AVLTree } from "../src/AVLTree"; import { AVLTreeNode } from "../src/AVLTreeNode"; import { IClonable } from "@drozdik.m/common-interfaces/IClonable"; import { IComparable } from "@drozdik.m/common-interfaces/IComparable"; import { IComparator } from "@drozdik.m/common-interfaces/IComparator"; //-----TESTING BEGIN----- let unitTest = new UnitTest("AVL Tree"); unitTest.AddTestCase("Rotations", function () { let tree1: any = new AVLTree<number>(); tree1.root = new AVLTreeNode<number>(10); tree1.root.right = new AVLTreeNode<number>(20); tree1.root.right.right = new AVLTreeNode<number>(30); tree1.root.right.right.Update(); tree1.root.right.Update(); tree1.root.Update(); Assert.AreEqual(tree1.RotateLeft(tree1.root).value, 20); Assert.AreEqual(tree1.root.value, 20); Assert.AreEqual(tree1.root.left.value, 10); Assert.AreEqual(tree1.root.right.value, 30); Assert.AreEqual(tree1.root.left.parent.value, 20); Assert.AreEqual(tree1.root.right.parent.value, 20); Assert.IsNull(tree1.root.parent); Assert.IsNull(tree1.root.left.left); Assert.IsNull(tree1.root.left.right); Assert.IsNull(tree1.root.right.left); Assert.IsNull(tree1.root.right.right); let tree2: any = new AVLTree<number>(); tree2.root = new AVLTreeNode<number>(10); tree2.root.left = new AVLTreeNode<number>(5); tree2.root.right = new AVLTreeNode<number>(15); tree2.root.right.left = new AVLTreeNode<number>(12); tree2.root.right.right = new AVLTreeNode<number>(20); tree2.root.right.right.left = new AVLTreeNode<number>(18); tree2.root.right.right.right = new AVLTreeNode<number>(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(); Assert.AreEqual(tree2.RotateLeft(tree2.root.right).value, 20); Assert.AreEqual(tree2.root.value, 10); Assert.AreEqual(tree2.root.left.value, 5); Assert.AreEqual(tree2.root.right.value, 20); Assert.AreEqual(tree2.root.right.right.value, 25); Assert.AreEqual(tree2.root.right.left.value, 15); Assert.AreEqual(tree2.root.right.left.right.value, 18); Assert.AreEqual(tree2.root.right.left.left.value, 12); Assert.IsNull(tree2.root.parent); Assert.AreEqual(tree2.root.left.parent.value, 10); Assert.AreEqual(tree2.root.right.parent.value, 10); Assert.AreEqual(tree2.root.right.right.parent.value, 20); Assert.AreEqual(tree2.root.right.left.parent.value, 20); Assert.AreEqual(tree2.root.right.left.right.parent.value, 15); Assert.AreEqual(tree2.root.right.left.left.parent.value, 15); Assert.IsNull(tree2.root.left.left); Assert.IsNull(tree2.root.left.right); Assert.IsNull(tree2.root.right.right.right); Assert.IsNull(tree2.root.right.right.left); Assert.IsNull(tree2.root.right.left.left.right); Assert.IsNull(tree2.root.right.left.left.left); Assert.IsNull(tree2.root.right.left.right.right); Assert.IsNull(tree2.root.right.left.right.left); Assert.AreEqual(tree2.root.depth, 4); Assert.AreEqual(tree2.root.left.depth, 1); Assert.AreEqual(tree2.root.right.depth, 3); Assert.AreEqual(tree2.root.right.right.depth, 1); Assert.AreEqual(tree2.root.right.left.depth, 2); Assert.AreEqual(tree2.root.right.left.right.depth, 1); Assert.AreEqual(tree2.root.right.left.left.depth, 1); Assert.AreEqual(tree2.root.count, 7); Assert.AreEqual(tree2.root.left.count, 1); Assert.AreEqual(tree2.root.right.count, 5); Assert.AreEqual(tree2.root.right.right.count, 1); Assert.AreEqual(tree2.root.right.left.count, 3); Assert.AreEqual(tree2.root.right.left.right.count, 1); Assert.AreEqual(tree2.root.right.left.left.count, 1); Assert.AreEqual(tree2.RotateRight(tree2.root.right).value, 15); Assert.AreEqual(tree2.root.value, 10); Assert.AreEqual(tree2.root.left.value, 5); Assert.AreEqual(tree2.root.right.value, 15); Assert.AreEqual(tree2.root.right.left.value, 12); Assert.AreEqual(tree2.root.right.right.value, 20); Assert.AreEqual(tree2.root.right.right.left.value, 18); Assert.AreEqual(tree2.root.right.right.right.value, 25); Assert.IsNull(tree2.root.left.left); Assert.IsNull(tree2.root.left.right); Assert.IsNull(tree2.root.right.left.left); Assert.IsNull(tree2.root.right.left.right); Assert.IsNull(tree2.root.right.right.left.left); Assert.IsNull(tree2.root.right.right.left.right); Assert.IsNull(tree2.root.right.right.right.left); Assert.IsNull(tree2.root.right.right.right.right); Assert.IsNull(tree2.root.parent); Assert.AreEqual(tree2.root.left.parent.value, 10); Assert.AreEqual(tree2.root.right.parent.value, 10); Assert.AreEqual(tree2.root.right.left.parent.value, 15); Assert.AreEqual(tree2.root.right.right.parent.value, 15); Assert.AreEqual(tree2.root.right.right.left.parent.value, 20); Assert.AreEqual(tree2.root.right.right.right.parent.value, 20); Assert.AreEqual(tree2.root.depth, 4); Assert.AreEqual(tree2.root.left.depth, 1); Assert.AreEqual(tree2.root.right.depth, 3); Assert.AreEqual(tree2.root.right.left.depth, 1); Assert.AreEqual(tree2.root.right.right.depth, 2); Assert.AreEqual(tree2.root.right.right.left.depth, 1); Assert.AreEqual(tree2.root.right.right.right.depth, 1); Assert.AreEqual(tree2.root.count, 7); Assert.AreEqual(tree2.root.left.count, 1); Assert.AreEqual(tree2.root.right.count, 5); Assert.AreEqual(tree2.root.right.left.count, 1); Assert.AreEqual(tree2.root.right.right.count, 3); Assert.AreEqual(tree2.root.right.right.left.count, 1); Assert.AreEqual(tree2.root.right.right.right.count, 1); let tree3: any = new AVLTree<number>(); tree3.root = new AVLTreeNode<number>(10); tree3.root.left = new AVLTreeNode<number>(5); tree3.root.left.left = new AVLTreeNode<number>(3); tree3.root.left.left.Update(); tree3.root.left.Update(); tree3.root.Update(); Assert.AreEqual(tree3.RotateRight(tree3.root).value, 5); Assert.AreEqual(tree3.root.value, 5); Assert.AreEqual(tree3.root.left.value, 3); Assert.AreEqual(tree3.root.right.value, 10); Assert.AreEqual(tree3.root.left.parent.value, 5); Assert.AreEqual(tree3.root.right.parent.value, 5); Assert.IsNull(tree3.root.parent); Assert.IsNull(tree3.root.left.left); Assert.IsNull(tree3.root.left.right); Assert.IsNull(tree3.root.right.left); Assert.IsNull(tree3.root.right.right); }); unitTest.AddTestCase("Double rotations", function () { let tree4: any = new AVLTree<number>(); tree4.root = new AVLTreeNode<number>(10); tree4.root.right = new AVLTreeNode<number>(15); tree4.root.right.left = new AVLTreeNode<number>(12); tree4.root.right.left.Update(); tree4.root.right.Update(); tree4.root.Update(); Assert.AreEqual(tree4.RotateRightLeft(tree4.root).value, 12); Assert.AreEqual(tree4.root.value, 12); Assert.AreEqual(tree4.root.left.value, 10); Assert.AreEqual(tree4.root.right.value, 15); Assert.AreEqual(tree4.root.left.parent.value, 12); Assert.AreEqual(tree4.root.right.parent.value, 12); Assert.IsNull(tree4.root.parent); Assert.IsNull(tree4.root.left.left); Assert.IsNull(tree4.root.left.right); Assert.IsNull(tree4.root.right.left); Assert.IsNull(tree4.root.right.right); let tree5: any = new AVLTree<number>(); tree5.root = new AVLTreeNode<number>(10); tree5.root.left = new AVLTreeNode<number>(5); tree5.root.left.right = new AVLTreeNode<number>(7); tree5.root.left.right.Update(); tree5.root.left.Update(); tree5.root.Update(); Assert.AreEqual(tree5.RotateLeftRight(tree5.root).value, 7); Assert.AreEqual(tree5.root.value, 7); Assert.AreEqual(tree5.root.left.value, 5); Assert.AreEqual(tree5.root.right.value, 10); Assert.AreEqual(tree5.root.left.parent.value, 7); Assert.AreEqual(tree5.root.right.parent.value, 7); Assert.IsNull(tree5.root.parent); Assert.IsNull(tree5.root.left.left); Assert.IsNull(tree5.root.left.right); Assert.IsNull(tree5.root.right.left); Assert.IsNull(tree5.root.right.right); }); unitTest.AddTestCase("Insert", function () { //Insert let tree6: any = new AVLTree<number>(); tree6.Insert(20); Assert.AreEqual(tree6.root.value, 20); Assert.AreEqual(tree6.Count(), 1); tree6.Insert(20); Assert.AreEqual(tree6.root.value, 20); Assert.IsNull(tree6.left); Assert.IsNull(tree6.right); Assert.AreEqual(tree6.Count(), 1); tree6.Insert(30); Assert.AreEqual(tree6.root.value, 20); Assert.AreEqual(tree6.root.right.value, 30); Assert.AreEqual(tree6.Count(), 2); tree6.Insert(40); Assert.AreEqual(tree6.root.value, 30); Assert.AreEqual(tree6.root.left.value, 20); Assert.AreEqual(tree6.root.right.value, 40); Assert.AreEqual(tree6.Count(), 3); tree6.Insert(50); Assert.AreEqual(tree6.root.value, 30); Assert.AreEqual(tree6.root.left.value, 20); Assert.AreEqual(tree6.root.right.value, 40); Assert.AreEqual(tree6.root.right.right.value, 50); Assert.AreEqual(tree6.Count(), 4); tree6.Insert(45); Assert.AreEqual(tree6.root.value, 30); Assert.AreEqual(tree6.root.left.value, 20); Assert.AreEqual(tree6.root.right.value, 45); Assert.AreEqual(tree6.root.right.right.value, 50); Assert.AreEqual(tree6.root.right.left.value, 40); Assert.AreEqual(tree6.Count(), 5); tree6.Insert(35); Assert.AreEqual(tree6.root.value, 40); Assert.AreEqual(tree6.root.left.value, 30); Assert.AreEqual(tree6.root.left.left.value, 20); Assert.AreEqual(tree6.root.left.right.value, 35); Assert.AreEqual(tree6.root.right.value, 45); Assert.AreEqual(tree6.root.right.right.value, 50); Assert.AreEqual(tree6.Count(), 6); tree6.Insert(10); Assert.AreEqual(tree6.root.value, 40); Assert.AreEqual(tree6.root.left.value, 30); Assert.AreEqual(tree6.root.left.left.value, 20); Assert.AreEqual(tree6.root.left.left.left.value, 10); Assert.AreEqual(tree6.root.left.right.value, 35); Assert.AreEqual(tree6.root.right.value, 45); Assert.AreEqual(tree6.root.right.right.value, 50); Assert.AreEqual(tree6.Count(), 7); tree6.Insert(0); Assert.AreEqual(tree6.root.value, 40); Assert.AreEqual(tree6.root.left.value, 30); Assert.AreEqual(tree6.root.left.left.value, 10); Assert.AreEqual(tree6.root.left.left.left.value, 0); Assert.AreEqual(tree6.root.left.left.right.value, 20); Assert.AreEqual(tree6.root.left.right.value, 35); Assert.AreEqual(tree6.root.right.value, 45); Assert.AreEqual(tree6.root.right.right.value, 50); Assert.AreEqual(tree6.Count(), 8); tree6.Insert(25); Assert.AreEqual(tree6.root.value, 40); Assert.AreEqual(tree6.root.left.value, 20); Assert.AreEqual(tree6.root.left.left.value, 10); Assert.AreEqual(tree6.root.left.left.left.value, 0); Assert.AreEqual(tree6.root.left.right.value, 30); Assert.AreEqual(tree6.root.left.right.left.value, 25); Assert.AreEqual(tree6.root.left.right.right.value, 35); Assert.AreEqual(tree6.root.right.value, 45); Assert.AreEqual(tree6.root.right.right.value, 50); Assert.AreEqual(tree6.Count(), 9); Assert.IsNull(tree6.root.parent); Assert.AreEqual(tree6.root.left.parent.value, 40); Assert.AreEqual(tree6.root.right.parent.value, 40); Assert.AreEqual(tree6.root.left.left.parent.value, 20); Assert.AreEqual(tree6.root.left.left.left.parent.value, 10); Assert.AreEqual(tree6.root.left.right.parent.value, 20); Assert.AreEqual(tree6.root.left.right.left.parent.value, 30); Assert.AreEqual(tree6.root.left.right.right.parent.value, 30); Assert.AreEqual(tree6.root.right.right.parent.value, 45); Assert.AreEqual(tree6.root.sign, -1); Assert.AreEqual(tree6.root.left.sign, 0); Assert.AreEqual(tree6.root.left.left.sign, -1); Assert.AreEqual(tree6.root.left.left.left.sign, 0); Assert.AreEqual(tree6.root.left.right.sign, 0); Assert.AreEqual(tree6.root.left.right.left.sign, 0); Assert.AreEqual(tree6.root.left.right.right.sign, 0); Assert.AreEqual(tree6.root.right.sign, 1); Assert.AreEqual(tree6.root.right.right.sign, 0); Assert.AreEqual(tree6.root.count, 9); Assert.AreEqual(tree6.root.left.count, 6); Assert.AreEqual(tree6.root.left.left.count, 2); Assert.AreEqual(tree6.root.left.left.left.count, 1); Assert.AreEqual(tree6.root.left.right.count, 3); Assert.AreEqual(tree6.root.left.right.left.count, 1); Assert.AreEqual(tree6.root.left.right.right.count, 1); Assert.AreEqual(tree6.root.right.count, 2); Assert.AreEqual(tree6.root.right.right.count, 1); Assert.AreEqual(tree6.root.depth, 4); Assert.AreEqual(tree6.root.left.depth, 3); Assert.AreEqual(tree6.root.left.left.depth, 2); Assert.AreEqual(tree6.root.left.left.left.depth, 1); Assert.AreEqual(tree6.root.left.right.depth, 2); Assert.AreEqual(tree6.root.left.right.left.depth, 1); Assert.AreEqual(tree6.root.left.right.right.depth, 1); Assert.AreEqual(tree6.root.right.depth, 2); Assert.AreEqual(tree6.root.right.right.depth, 1); }); unitTest.AddTestCase("Find", function () { let tree11 = new AVLTree<number>(); let valuesArray = [40, 10, 20, 80, 90, 50, 60, 70, 0, 30, 15, 45, 85, 5]; for (let i = 0; i < valuesArray.length; i++) tree11.Insert(valuesArray[i]); for (let i = 0; i < valuesArray.length; i++) Assert.AreEqual(tree11.Find(valuesArray[i]).Value(), valuesArray[i]); Assert.IsFalse(tree11.Find(999).HasValue()); let bst4 = new AVLTree<number>(); Assert.IsFalse(bst4.FindMin().HasValue()); Assert.IsFalse(bst4.FindMax().HasValue()); Assert.IsFalse(bst4.Find(1).HasValue()); Assert.IsFalse(bst4.First().HasValue()); Assert.IsFalse(bst4.Last().HasValue()); bst4.Insert(1); Assert.AreEqual(bst4.First().Value(), 1); Assert.AreEqual(bst4.Last().Value(), 1); }); unitTest.AddTestCase("Iterator", function () { //Iterator - next, prev, value, hasvalue let tree11 = new AVLTree<number>(); let valuesArray = [40, 10, 20, 80, 90, 50, 60, 70, 0, 30, 15, 45, 85, 5]; for (let i = 0; i < valuesArray.length; i++) tree11.Insert(valuesArray[i]); valuesArray = valuesArray.sort(function (a: number, b: number) { return a - b; }); let number = 0; for (let it = tree11.First(); it.HasValue(); it.Next()) Assert.AreEqual(it.Value(), valuesArray[number++]); Assert.AreEqual(valuesArray.length, number); number = valuesArray.length - 1; for (let it = tree11.Last(); it.HasValue(); it.Previous()) Assert.AreEqual(it.Value(), valuesArray[number--]); Assert.AreEqual(-1, number); }); unitTest.AddTestCase("Remove", function () { let tree6Clone: any = new AVLTree<number>(); 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); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 20); Assert.AreEqual(tree6Clone.root.left.left.value, 10); Assert.AreEqual(tree6Clone.root.left.left.left.value, 0); Assert.AreEqual(tree6Clone.root.left.right.value, 30); Assert.AreEqual(tree6Clone.root.left.right.right.value, 35); Assert.AreEqual(tree6Clone.root.right.value, 45); Assert.AreEqual(tree6Clone.root.right.right.value, 50); Assert.AreEqual(tree6Clone.Count(), 8); tree6Clone.Remove(30); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 20); Assert.AreEqual(tree6Clone.root.left.left.value, 10); Assert.AreEqual(tree6Clone.root.left.left.left.value, 0); Assert.AreEqual(tree6Clone.root.left.right.value, 35); Assert.AreEqual(tree6Clone.root.right.value, 45); Assert.AreEqual(tree6Clone.root.right.right.value, 50); Assert.AreEqual(tree6Clone.Count(), 7); tree6Clone.Remove(35); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 10); Assert.AreEqual(tree6Clone.root.left.left.value, 0); Assert.AreEqual(tree6Clone.root.left.right.value, 20); Assert.AreEqual(tree6Clone.root.right.value, 45); Assert.AreEqual(tree6Clone.root.right.right.value, 50); Assert.AreEqual(tree6Clone.Count(), 6); tree6Clone.Remove(0); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 10); Assert.AreEqual(tree6Clone.root.left.right.value, 20); Assert.AreEqual(tree6Clone.root.right.value, 45); Assert.AreEqual(tree6Clone.root.right.right.value, 50); Assert.AreEqual(tree6Clone.Count(), 5); tree6Clone.Remove(50); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 10); Assert.AreEqual(tree6Clone.root.left.right.value, 20); Assert.AreEqual(tree6Clone.root.right.value, 45); Assert.AreEqual(tree6Clone.Count(), 4); tree6Clone.Remove(45); Assert.AreEqual(tree6Clone.root.value, 20); Assert.AreEqual(tree6Clone.root.left.value, 10); Assert.AreEqual(tree6Clone.root.right.value, 40); Assert.AreEqual(tree6Clone.Count(), 3); tree6Clone.Remove(20); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 10); Assert.IsNull(tree6Clone.root.right); Assert.AreEqual(tree6Clone.Count(), 2); tree6Clone.Remove(20); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 10); Assert.IsNull(tree6Clone.root.right); Assert.AreEqual(tree6Clone.Count(), 2); tree6Clone.Remove(999); tree6Clone.RemoveAt(tree6Clone.Find(999)); Assert.AreEqual(tree6Clone.root.value, 40); Assert.AreEqual(tree6Clone.root.left.value, 10); Assert.IsNull(tree6Clone.root.right); Assert.AreEqual(tree6Clone.Count(), 2); tree6Clone.RemoveAt(tree6Clone.Find(40)); Assert.AreEqual(tree6Clone.root.value, 10); Assert.IsNull(tree6Clone.root.right); Assert.IsNull(tree6Clone.root.left); Assert.AreEqual(tree6Clone.Count(), 1); tree6Clone.Remove(10); Assert.IsNull(tree6Clone.root); Assert.AreEqual(tree6Clone.Count(), 0); tree6Clone.Insert(20); tree6Clone.Insert(30); tree6Clone.Insert(10); tree6Clone.Insert(40); tree6Clone.RemoveAt(tree6Clone.Find(10)); Assert.AreEqual(tree6Clone.root.value, 30); Assert.AreEqual(tree6Clone.root.left.value, 20); Assert.AreEqual(tree6Clone.root.right.value, 40); tree6Clone.Insert(35); tree6Clone.RemoveAt(tree6Clone.Find(20)); Assert.AreEqual(tree6Clone.root.value, 35); Assert.AreEqual(tree6Clone.root.left.value, 30); Assert.AreEqual(tree6Clone.root.right.value, 40); }); unitTest.AddTestCase("Clone", function () { let tree7 = new AVLTree<number>(); let valuesArray = [45, 85, 5, 60, 70, 80, 90, 10, 20, 30, 15, 40, 0, 55]; for (let i = 0; i < valuesArray.length; i++) tree7.Insert(valuesArray[i]); valuesArray = valuesArray.sort(function (a: number, b: number) { return a - b; }); let number = 0; for (let it = tree7.First(); it.HasValue(); it.Next()) Assert.AreEqual(it.Value(), valuesArray[number++]); Assert.AreEqual(valuesArray.length, number); let tree8 = tree7.Clone(); for (let i = 0; i < valuesArray.length; i++) tree7.UpdateAt(valuesArray[i] * 10, tree7.Find(valuesArray[i])); number = 0; for (let it = tree8.First(); it.HasValue(); it.Next()) Assert.AreEqual(it.Value(), valuesArray[number++]); Assert.AreEqual(valuesArray.length, number); Assert.AreEqual(tree7.Count(), valuesArray.length); Assert.AreEqual(tree8.Count(), valuesArray.length); tree7.Clear(); Assert.AreEqual(tree7.Count(), 0); Assert.AreEqual(tree8.Count(), valuesArray.length); number = 0; for (let it = tree8.First(); it.HasValue(); it.Next()) Assert.AreEqual(it.Value(), valuesArray[number++]); Assert.AreEqual(valuesArray.length, number); }); unitTest.AddTestCase("Comparator, Clone", function () { class FooCmp implements IComparable<FooCmp>, IClonable<FooCmp> { number: number; constructor(n: number) { this.number = n; } GetComparator(): IComparator<FooCmp> { return function (a: FooCmp, b: FooCmp): number { return a.number - b.number; } } Clone(): FooCmp { return new FooCmp(this.number); } } let tree9 = new AVLTree<FooCmp>([ new FooCmp(0), new FooCmp(1), new FooCmp(2), new FooCmp(3), new FooCmp(4) ]); Assert.AreEqual(tree9.Find(new FooCmp(0)).Value().number, 0); Assert.AreEqual(tree9.Find(new FooCmp(1)).Value().number, 1); Assert.AreEqual(tree9.Find(new FooCmp(2)).Value().number, 2); Assert.AreEqual(tree9.Find(new FooCmp(3)).Value().number, 3); Assert.AreEqual(tree9.Find(new FooCmp(4)).Value().number, 4); let tree10 = tree9.Clone(); Assert.AreEqual(tree10.Count(), 5); Assert.AreEqual(tree10.Find(new FooCmp(0)).Value().number, 0); Assert.AreEqual(tree10.Find(new FooCmp(1)).Value().number, 1); Assert.AreEqual(tree10.Find(new FooCmp(2)).Value().number, 2); Assert.AreEqual(tree10.Find(new FooCmp(3)).Value().number, 3); Assert.AreEqual(tree10.Find(new FooCmp(4)).Value().number, 4); tree10.Find(new FooCmp(0)).Value().number = -1; Assert.AreEqual(tree10.Find(new FooCmp(-1)).Value().number, -1); tree10.Dispose(); Assert.IsFalse(tree9.Find(new FooCmp(-1)).HasValue()); Assert.AreEqual(tree9.Find(new FooCmp(0)).Value().number, 0); Assert.AreEqual(tree9.Find(new FooCmp(1)).Value().number, 1); Assert.AreEqual(tree9.Find(new FooCmp(2)).Value().number, 2); Assert.AreEqual(tree9.Find(new FooCmp(3)).Value().number, 3); Assert.AreEqual(tree9.Find(new FooCmp(4)).Value().number, 4); }); unitTest.AddTestCase("Update", function () { let tree12 = new AVLTree<number>(); tree12.Update(10, 10); let valuesArray = [40, 60, 70, 0, 30, 15, 45, 85, 5, 10, 20, 80, 90, 55]; tree12.Build(valuesArray); for (let i = 0; i < valuesArray.length; i++) tree12.Update(valuesArray[i], 0); for (let i = 0; i < valuesArray.length; i++) tree12.UpdateAt(0, tree12.Find(valuesArray[i])); for (let i = 0; i < valuesArray.length; i++) tree12.Update(valuesArray[i], 85); for (let i = 0; i < valuesArray.length; i++) tree12.UpdateAt(30, tree12.Find(valuesArray[i])); valuesArray = valuesArray.sort(function (a: number, b: number) { return a - b; }); let number = 0; for (let it = tree12.First(); it.HasValue(); it.Next()) Assert.AreEqual(it.Value(), valuesArray[number++]); Assert.AreEqual(valuesArray.length, number); for (let 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 (let i = 0; i < valuesArray.length; i++) tree12.Update(valuesArray[i] * 10, valuesArray[i] * 100); number = 0; for (let it = tree12.First(); it.HasValue(); it.Next()) Assert.AreEqual(it.Value(), valuesArray[number++] * 100); Assert.AreEqual(valuesArray.length, number); }); unitTest.AddTestCase("At", function () { let tree13 = new AVLTree<number>(); let 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: number, b: number) { return a - b; }); for (let i = 0; +i < valuesArray.length; i++) Assert.AreEqual(tree13.At(i), valuesArray[i]); for (let i = 0; +i < valuesArray.length; i++) Assert.AreEqual(tree13.AtIterator(i).Value(), valuesArray[i]); Assert.IsFalse(tree13.AtIterator(-1).HasValue()); Assert.IsFalse(tree13.AtIterator(valuesArray.length).HasValue()); Assert.IsNull(tree13.At(-1)); Assert.IsNull(tree13.At(valuesArray.length)); }); unitTest.Run();