public void AVLTree_Accuracy_Test() { var nodeCount = 1000; var rnd = new Random(); var sorted = Enumerable.Range(1, nodeCount).ToList(); var randomNumbers = sorted .OrderBy(x => rnd.Next()) .ToList(); var tree = new AVLTree <int>(); for (int i = 0; i < nodeCount; i++) { tree.Insert(randomNumbers[i]); Assert.IsTrue(tree.HasItem(randomNumbers[i])); Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue)); tree.Root.VerifyCount(); var actualHeight = tree.GetHeight(); //http://stackoverflow.com/questions/30769383/finding-the-minimum-and-maximum-height-in-a-avl-tree-given-a-number-of-nodes var maxHeight = 1.44 * Math.Log(nodeCount + 2, 2) - 0.328; Assert.IsTrue(actualHeight < maxHeight); Assert.IsTrue(tree.Count == i + 1); } for (int i = 0; i < sorted.Count; i++) { Assert.AreEqual(sorted[i], tree.ElementAt(i)); Assert.AreEqual(i, tree.IndexOf(sorted[i])); } randomNumbers = Enumerable.Range(1, nodeCount) .OrderBy(x => rnd.Next()) .ToList(); //IEnumerable test using linq Assert.AreEqual(tree.Count, tree.Count()); Assert.AreEqual(tree.Count, tree.AsEnumerableDesc().Count()); for (int i = 0; i < nodeCount; i++) { if (rnd.NextDouble() >= 0.5) { tree.Delete(randomNumbers[i]); } else { var index = tree.IndexOf(randomNumbers[i]); Assert.AreEqual(tree.ElementAt(index), randomNumbers[i]); tree.RemoveAt(index); } Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue)); tree.Root.VerifyCount(); var actualHeight = tree.GetHeight(); //http://stackoverflow.com/questions/30769383/finding-the-minimum-and-maximum-height-in-a-avl-tree-given-a-number-of-nodes var maxHeight = 1.44 * Math.Log(nodeCount + 2, 2) - 0.328; Assert.IsTrue(actualHeight < maxHeight); } Assert.IsTrue(tree.Count == 0); }