예제 #1
0
        public static void AddRange_MultipleKeys_FormsCorrectBST()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2
            });

            var rootNode = tree.Search(5);

            Assert.AreEqual(5, rootNode !.Key);
            Assert.AreEqual(3, rootNode !.Left !.Key);
            Assert.IsNull(rootNode !.Right);

            var threeNode = tree.Search(3);

            Assert.AreEqual(3, threeNode !.Key);
            Assert.AreEqual(2, threeNode !.Left !.Key);
            Assert.AreEqual(4, threeNode !.Right !.Key);

            var twoNode = tree.Search(2);

            Assert.IsNull(twoNode !.Left);
            Assert.IsNull(twoNode !.Right);

            var fourNode = tree.Search(4);

            Assert.IsNull(fourNode !.Left);
            Assert.IsNull(fourNode !.Right);
        }
예제 #2
0
        public static void Remove_NodesWithOneChild_CorrectlyRemovesNodes()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            tree.Remove(4);
            var threeRemoveResult = tree.Remove(3);

            Assert.IsTrue(threeRemoveResult);
            Assert.IsNull(tree.Search(3));
            Assert.IsNull(tree.Search(2) !.Left);
            Assert.IsNull(tree.Search(2) !.Right);
            Assert.AreEqual(5, tree.Count);

            tree.Remove(6);
            var sevenRemoveResult = tree.Remove(7);

            Assert.IsTrue(sevenRemoveResult);
            Assert.IsNull(tree.Search(7));
            Assert.IsNull(tree.Search(8) !.Left);
            Assert.IsNull(tree.Search(8) !.Right);
            Assert.AreEqual(3, tree.Count);
        }
예제 #3
0
        public static void Add_KeyAlreadyInTree_ThrowsCorrectException()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2
            });

            _ = Assert.Throws <ArgumentException>(() => tree.Add(5));
        }
예제 #4
0
        public static void GetMin_NonEmptyTree_ReturnsCorrectValue()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            Assert.AreEqual(2, tree.GetMin() !.Key);
        }
예제 #5
0
        public static void Remove_NonExistentElement_ReturnsFalse()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            Assert.IsFalse(tree.Remove(999));
            Assert.AreEqual(7, tree.Count);
        }
예제 #6
0
        public static void Constructor_UseCustomComparer_FormsCorrectTree()
        {
            var cmpFunc = Comparer <string> .Create((x, y) => x.Length - y.Length);

            var tree  = new BinarySearchTree <string>(cmpFunc);
            var elems = new[] { "z", "yy", "vvv", "bbbb", "fffff", "pppppp" };

            tree.AddRange(elems);

            Assert.IsNotNull(tree.Search("vvv"));
            Assert.AreEqual("bbbb", tree.Search("vvv") !.Right !.Key);
        }
예제 #7
0
        public static void GetKeysPostOrder_MultipleKeys_ReturnsAllKeysInCorrectOrder()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            var keys     = tree.GetKeysPostOrder();
            var expected = new List <int> {
                2, 4, 3, 6, 8, 7, 5
            };

            Assert.IsTrue(keys.SequenceEqual(expected));
        }
예제 #8
0
        public static void Remove_NodesWithTwoChildren_CorrectlyRemovesNodes()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            var sevenRemoveResult = tree.Remove(7);

            Assert.IsTrue(sevenRemoveResult);
            Assert.IsNull(tree.Search(7));
            Assert.IsNull(tree.Search(6) !.Left);
            Assert.IsNotNull(tree.Search(6) !.Right);
            Assert.AreEqual(6, tree.Count);
        }
예제 #9
0
        public static void Contains_MultipleKeys_FindsAllKeys()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            Assert.IsTrue(tree.Contains(2));
            Assert.IsTrue(tree.Contains(3));
            Assert.IsTrue(tree.Contains(4));
            Assert.IsTrue(tree.Contains(5));
            Assert.IsTrue(tree.Contains(6));
            Assert.IsTrue(tree.Contains(7));
            Assert.IsTrue(tree.Contains(8));
        }
예제 #10
0
        public static void Search_MultipleKeys_FindsAllKeys()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            Assert.AreEqual(2, tree.Search(2) !.Key);
            Assert.AreEqual(3, tree.Search(3) !.Key);
            Assert.AreEqual(4, tree.Search(4) !.Key);
            Assert.AreEqual(5, tree.Search(5) !.Key);
            Assert.AreEqual(6, tree.Search(6) !.Key);
            Assert.AreEqual(7, tree.Search(7) !.Key);
            Assert.AreEqual(8, tree.Search(8) !.Key);
        }
예제 #11
0
        public static void Remove_RemoveRoot_CorrectlyRemovesRoot()
        {
            var tree = new BinarySearchTree <int>();

            tree.Add(5);
            tree.Remove(5);

            Assert.AreEqual(0, tree.Count);
            Assert.IsNull(tree.Search(5));

            tree.AddRange(new List <int> {
                5, 4, 6
            });
            tree.Remove(5);

            Assert.AreEqual(2, tree.Count);
            Assert.IsNull(tree.Search(5));
            Assert.IsNotNull(tree.Search(4));
            Assert.IsNotNull(tree.Search(6));
            Assert.AreEqual(6, tree.Search(4) !.Right !.Key);
        }
예제 #12
0
        public static void Remove_LeafNodes_CorrectlyRemovesNodes()
        {
            var tree = new BinarySearchTree <int>();

            tree.AddRange(new List <int> {
                5, 3, 4, 2, 7, 6, 8
            });

            var twoRemoveResult = tree.Remove(2);

            Assert.IsTrue(twoRemoveResult);
            Assert.IsNull(tree.Search(2));
            Assert.IsNull(tree.Search(3) !.Left);
            Assert.IsNotNull(tree.Search(3) !.Right);
            Assert.AreEqual(6, tree.Count);

            var fourRemoveResult = tree.Remove(4);

            Assert.IsTrue(fourRemoveResult);
            Assert.IsNull(tree.Search(4));
            Assert.IsNull(tree.Search(3) !.Left);
            Assert.IsNull(tree.Search(3) !.Right);
            Assert.AreEqual(5, tree.Count);
        }