public void TestBSTRemove()
        {
            var tree = new BinarySearchTree<int>() { 40, 11, 62, 43, 34, 16, 10, 63 };

            Assert.IsTrue(tree.Contains(43), "\nChecking if 43 is there.");
            Assert.IsTrue(tree.Remove(43), "\nRemoving 43.");
            Assert.IsFalse(tree.Contains(43), "\nChecking if 43 is still there.");
        }
        public static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;

            BinarySearchTree <int> tree = new BinarySearchTree <int>();

            tree.Root = new BinaryTreeNode <int>()
            {
                Data = 100
            };
            tree.Root.Left = new BinaryTreeNode <int>()
            {
                Data = 50, Parent = tree.Root
            };
            tree.Root.Right = new BinaryTreeNode <int>()
            {
                Data = 150, Parent = tree.Root
            };
            tree.Count = 3;
            VisualizeTree(tree, "The BST with three nodes (50, 100, 150):");

            tree.Add(75);
            tree.Add(125);
            VisualizeTree(tree, "The BST after adding two nodes (75, 125):");

            tree.Add(25);
            tree.Add(175);
            tree.Add(90);
            tree.Add(110);
            tree.Add(135);
            VisualizeTree(tree, "The BST after adding five nodes (25, 175, 90, 110, 135):");

            tree.Remove(25);
            VisualizeTree(tree, "The BST after removing the node 25:");

            tree.Remove(50);
            VisualizeTree(tree, "The BST after removing the node 50:");

            tree.Remove(100);
            VisualizeTree(tree, "The BST after removing the node 100:");

            Console.Write("Pre-order traversal:\t");
            Console.Write(string.Join(", ", tree.Traverse(TraversalEnum.PREORDER).Select(n => n.Data)));

            Console.Write("\nIn-order traversal:\t");
            Console.Write(string.Join(", ", tree.Traverse(TraversalEnum.INORDER).Select(n => n.Data)));

            Console.Write("\nPost-order traversal:\t");
            Console.Write(string.Join(", ", tree.Traverse(TraversalEnum.POSTORDER).Select(n => n.Data)));

            tree.Remove(90);
            VisualizeTree(tree, "---");

            tree.Remove(75);
            VisualizeTree(tree, "---");

            tree.Remove(125);
            VisualizeTree(tree, "---");

            tree.Remove(110);
            VisualizeTree(tree, "---");

            tree.Remove(175);
            VisualizeTree(tree, "---");

            tree.Remove(135);
            VisualizeTree(tree, "---");

            tree.Remove(150);
            VisualizeTree(tree, "---");
            Console.ReadLine();
        }
 public void TestRemove()
 {
     BinarySearchTree<int> tree = new BinarySearchTree<int>();
     //fails to remove item from empty list.
     Assert.IsFalse(tree.Remove(10));
     tree.Add(10);
     tree.Add(12);
     Assert.IsTrue(tree.Remove(10));
     Assert.IsFalse(tree.Contains(10));
     Assert.IsFalse(tree.Remove(10));
 }
        public void testMassAddRemove()
        {
            BinarySearchTree<int> tree = new BinarySearchTree<int>();
            List<int> list = new List<int>();
            Random r = new Random();
            int numberToAdd = r.Next(1000000);
            for (int i = 0; i < 1000; i++)
            {
                while (list.Contains(numberToAdd))
                {
                    numberToAdd = r.Next(1000000);
                }
                list.Add(numberToAdd);
                tree.Add(numberToAdd);
            }
            Assert.IsTrue(list.Count == tree.Count && list.Count == 1000);
            list.Sort();
            Assert.IsTrue(Enumerable.SequenceEqual(list, tree));
            int curr;
            for (int i = 0; i < list.Count; i++)
            {
                curr = list.ElementAt(0);
                Assert.IsTrue(list.Remove(curr));
                Assert.IsTrue(tree.Remove(curr));
            }
            Assert.IsTrue(Enumerable.SequenceEqual(list, tree));

            numberToAdd = r.Next(1000000);
            for (int i = 0; i < 1000; i++)
            {
                while (list.Contains(numberToAdd))
                {
                    numberToAdd = r.Next(1000000);
                }
                list.Add(numberToAdd);
                tree.Add(numberToAdd);
                if (i % 2 == 0)
                {
                    curr = list.ElementAt(r.Next(list.Count));
                    Assert.IsTrue(list.Remove(curr));
                    Assert.IsTrue(tree.Remove(curr));
                }
            }
            list.Sort();
            Assert.IsTrue(Enumerable.SequenceEqual(list, tree));
        }
 public void TestIterator()
 {
     BinarySearchTree<int> tree = new BinarySearchTree<int>();
     //empty tree should give no iterations.
     foreach (int curr in tree)
     {
         Assert.Fail("Should be empty.");
     }
     for(int i = 0; i < 100; i++)  {
         tree.Add(i);
     }
     int element = 0;
     foreach(int curr in tree) {
         Assert.AreEqual(element, curr);
         element++;
     }
     //remove root element, an item with 1 child in the middle and a leaf with no children at bottom. Recheck everything iterates in order.
     tree.Remove(0);
     tree.Remove(50);
     tree.Remove(100);
     element = 1;
     foreach (int curr in tree)
     {
         Assert.AreEqual(element, curr);
         if (element == 49)
             element += 2;
         else
             element++;
     }
     //re add 50 so that 51 now has child on left of 50 and child right of 52.
     tree.Add(50);
     element = 1;
     foreach (int curr in tree)
     {
         Assert.AreEqual(element, curr);
         element++;
     }
     //remove node with 2 children, check iterates correctly still.
     tree.Remove(51);
     element = 1;
     foreach (int curr in tree)
     {
         Assert.AreEqual(element, curr);
         if (element == 50)
             element += 2;
         else
             element++;
     }
 }
 public void TestCount()
 {
     BinarySearchTree<int> tree = new BinarySearchTree<int>();
     Assert.IsTrue(tree.Count == 0);
     tree.Add(10);
     Assert.IsTrue(tree.Count == 1);
     for (int i = 100; i < 200; i++)
     {
         tree.Add(i);
     }
     Assert.IsTrue(tree.Count == 101);
     tree.Remove(10);
     Assert.IsTrue(tree.Count == 100);
     for (int i = 100; i < 200; i++)
     {
         tree.Remove(i);
     }
     Assert.IsTrue(tree.Count == 0);
     //count isnt decremented if unsuccessfully try to remove an item.
     tree.Remove(10);
     Assert.IsTrue(tree.Count == 0);
 }