public static void DoTest()
        {
            AVLTree<int> avlTree = new AVLTree<int>();

            //
            // CASE #1
            // Insert: 4, 5, 7
            // SIMPLE *left* rotation for node 4.
            //
            /***************************************
             ** UNBALANCED    ===>    BALANCED
             **     4                   5
             **      \                 / \
             **       5       ===>    4   7
             **        \ 
             **         7 
             **
             ***************************************
             */
            avlTree.Insert(4); // insert
            avlTree.Insert(5); // insert
            avlTree.Insert(7); // insert

            // ASSERT CAST 1;
            AssertCase_1(avlTree);


            //
            // CASE #2
            // Insert to the previous tree: 2 and then 1.
            // SIMPLE *right* rotation for node 4.
            //
            /*********************************************
             ** UNBALANCED    ===>    BALANCED
             **        5                 5
             **       / \               / \
             **      4   7    ===>     2   7
             **     /                 / \
             **    2                 1   4
             **   /
             **  1
             **
             *********************************************
             */
            avlTree.Insert(2); // insert
            avlTree.Insert(1); // insert

            // ASSERT CASE 2
            AssertCase_2(avlTree);


            //
            // CASE #3
            // Insert to the previous tree: 3.
            // DOUBLE *right* rotation for node 5.
            //
            // The double rotation is achieved by:
            // 1> Simple *left* rotation for node 2, and then 
            // 2> Simple *right* rotation for node 5
            //
            /*************************************
             ** UNBALANCED     ===>    TRANSITION (1st R)    ===>    BALANCED (2nd Rt)
             **        5                      5                          4
             **       / \                    / \                        / \
             **      2   7     ===>         4   7        ===>          2   5
             **     / \                    /                          / \   \
             **    1   4                  2                          1   3   7
             **       /                  / \
             **      3                  1   3
             **
             *************************************
             */
            avlTree.Insert(3); // insert

            // ASSERT CASE 3
            AssertCase_3(avlTree);


            //
            // CASE #4
            // Insert to the previous tree: 6.
            // DOUBLE *right* rotation for node 5.
            //
            // The double rotation is achieved by:
            // 1> Simple *right* rotation for node 7, and then 
            // 2> Simple *left* rotation for node 5
            //
            /**************************************************************************
             ** UNBALANCED     ===>    TRANSITION (1st R)    ===>    BALANCED (2nd Rt)
             **        4                      4                          ..4..
             **       / \                    / \                        /     \
             **      2   5     ===>         2   5         ===>         2       6
             **     / \   \                / \   \                    / \     / \
             **    1   3   7              1   3   6                  1   3   5   7
             **           /                        \
             **          6                          7
             **
             **************************************************************************
             */
            avlTree.Insert(6); // insert

            // ASSERT CASE 4
            AssertCase_4(avlTree);


            //
            // CASE #5
            // REMOVE the tree's root: 4.
            //
            /**************************************************************************
             ** UNBALANCED     ===>    TRANSITION (1st R)    ===>    BALANCED (2nd Rt)
             **       null                                              .6.. 
             **      /   \                                             /    \
             **     2     6    ===>                      ===>         2      7
             **    / \   / \                                         / \    /
             **   1   3 5   7                                       1   3  5
             **
             **************************************************************************
             */
            avlTree.Remove(avlTree.Root.Value); // REMOVE 4

            // ASSERT CASE 5
            AssertCase_5(avlTree);

            
            //
            // CLEAR THE TREE AND START OVER
            // Compare two binary trees with each other (height-wise) using bulk-inserts

            avlTree = new AVLTree<int>();
            var bsTree = new BinarySearchTree<int>();

            List<int> treeDataList = new List<int>() { 15, 25, 5, 12, 1, 16, 20, 9, 9, 7, 7, -1, 11, 19, 30, 8, 10, 13, 28, 39 };
            avlTree.Insert(treeDataList);
            bsTree.Insert(treeDataList);

            int avlTreeHeight = avlTree.Height;
            int bsTreeHeight = bsTree.Height;

            Debug.Assert(avlTreeHeight < bsTreeHeight, "Wrong heights. AVL Tree must be shorted than BS Tree.");


            //
            // Draw the tree to the console.
            Console.WriteLine(String.Format("************\r\n** BST TREE:\r\n************\r\n"));
            Console.WriteLine(bsTree.DrawTree());

            Console.WriteLine("\r\n\r\n");

            Console.WriteLine(String.Format("************\r\n** AVL TREE:\r\n************\r\n"));
            Console.WriteLine(avlTree.DrawTree());

            //
            // OUTPUT OF AVL TREE DRAWER
            /*****
             ** ************
             ** ** AVL TREE:
             ** ************
             **                    ....15...
             **                   /         \
             **             ...9..      ..20.
             **            /      \    /     \
             **       ..5.      11   16    28
             **      /    \    /  \ / \   /  \
             **    1     7   9   12  19 25  30
             **    /\   / \ / \ / \  /\ /\ / \
             **  -1   7   8  10  13         39
             **  /\   /\ /\  /\  /\         /\
             *  
             */


            treeDataList = new List<int>() { 15, 25, 5, 12, 1, 9, 7, -1, 11, 30, 8, 10, 13, 28, 39 };
            avlTree.Clear();
            avlTree.Insert(treeDataList);

            Console.WriteLine(String.Format("************\r\n** AVL TREE:\r\n************\r\n"));
            Console.WriteLine(avlTree.DrawTree());

            //
            // OUTPUT OF AVL TREE DRAWER
            /*****
             ** 
             **           .......9......
             **          /              \
             **       .5       ....12...
             **      /  \     /         \
             **    1   7    11      .25.
             **    /\ / \   /\     /    \
             **  -1     8  10    15    30
             **  /\    /\  /\    /\   / \
             **                 13   28 39
             **                 /\   /\ /\
             **
             */

            Console.ReadLine();

        }//end-do-test
Exemple #2
0
        public static void DoTest()
        {
            AVLTree <int> avlTree = new AVLTree <int>();

            //
            // CASE #1
            // Insert: 4, 5, 7
            // SIMPLE *left* rotation for node 4.
            //

            /***************************************
            ** UNBALANCED    ===>    BALANCED
            **     4                   5
            **      \                 / \
            **       5       ===>    4   7
            **        \
            **         7
            **
            ***************************************
            */
            avlTree.Insert(4); // insert
            avlTree.Insert(5); // insert
            avlTree.Insert(7); // insert

            // ASSERT CAST 1;
            AssertCase_1(avlTree);


            //
            // CASE #2
            // Insert to the previous tree: 2 and then 1.
            // SIMPLE *right* rotation for node 4.
            //

            /*********************************************
            ** UNBALANCED    ===>    BALANCED
            **        5                 5
            **       / \               / \
            **      4   7    ===>     2   7
            **     /                 / \
            **    2                 1   4
            **   /
            **  1
            **
            *********************************************
            */
            avlTree.Insert(2); // insert
            avlTree.Insert(1); // insert

            // ASSERT CASE 2
            AssertCase_2(avlTree);


            //
            // CASE #3
            // Insert to the previous tree: 3.
            // DOUBLE *right* rotation for node 5.
            //
            // The double rotation is achieved by:
            // 1> Simple *left* rotation for node 2, and then
            // 2> Simple *right* rotation for node 5
            //

            /*************************************
            ** UNBALANCED     ===>    TRANSITION (1st R)    ===>    BALANCED (2nd Rt)
            **        5                      5                          4
            **       / \                    / \                        / \
            **      2   7     ===>         4   7        ===>          2   5
            **     / \                    /                          / \   \
            **    1   4                  2                          1   3   7
            **       /                  / \
            **      3                  1   3
            **
            *************************************
            */
            avlTree.Insert(3); // insert

            // ASSERT CASE 3
            AssertCase_3(avlTree);


            //
            // CASE #4
            // Insert to the previous tree: 6.
            // DOUBLE *right* rotation for node 5.
            //
            // The double rotation is achieved by:
            // 1> Simple *right* rotation for node 7, and then
            // 2> Simple *left* rotation for node 5
            //

            /**************************************************************************
            ** UNBALANCED     ===>    TRANSITION (1st R)    ===>    BALANCED (2nd Rt)
            **        4                      4                          ..4..
            **       / \                    / \                        /     \
            **      2   5     ===>         2   5         ===>         2       6
            **     / \   \                / \   \                    / \     / \
            **    1   3   7              1   3   6                  1   3   5   7
            **           /                        \
            **          6                          7
            **
            **************************************************************************
            */
            avlTree.Insert(6); // insert

            // ASSERT CASE 4
            AssertCase_4(avlTree);


            //
            // CASE #5
            // REMOVE the tree's root: 4.
            //

            /**************************************************************************
            ** UNBALANCED     ===>    TRANSITION (1st R)    ===>    BALANCED (2nd Rt)
            **       null                                              .6..
            **      /   \                                             /    \
            **     2     6    ===>                      ===>         2      7
            **    / \   / \                                         / \    /
            **   1   3 5   7                                       1   3  5
            **
            **************************************************************************
            */
            avlTree.Remove(avlTree.Root.Value); // REMOVE 4

            // ASSERT CASE 5
            AssertCase_5(avlTree);


            //
            // CLEAR THE TREE AND START OVER
            // Compare two binary trees with each other (height-wise) using bulk-inserts

            avlTree = new AVLTree <int>();
            var bsTree = new BinarySearchTree <int>();

            List <int> treeDataList = new List <int>()
            {
                15, 25, 5, 12, 1, 16, 20, 9, 9, 7, 7, -1, 11, 19, 30, 8, 10, 13, 28, 39
            };

            avlTree.Insert(treeDataList);
            bsTree.Insert(treeDataList);

            int avlTreeHeight = avlTree.Height;
            int bsTreeHeight  = bsTree.Height;

            Debug.Assert(avlTreeHeight < bsTreeHeight, "Wrong heights. AVL Tree must be shorted than BS Tree.");


            //
            // Draw the tree to the console.
            Console.WriteLine("************\r\n** BST TREE:\r\n************\r\n");
            Console.WriteLine(bsTree.DrawTree());

            Console.WriteLine("\r\n\r\n");

            Console.WriteLine("************\r\n** AVL TREE:\r\n************\r\n");
            Console.WriteLine(avlTree.DrawTree());

            //
            // OUTPUT OF AVL TREE DRAWER

            /**
            **          .....15....
            **         /           \
            **      ...9...        .20
            **     /       \      /   \
            **    .5       11    16    28
            **   /  \     /  \    \   / \
            **  1    7   9   12   19 25 30
            **  /   / \   \   \          \
            ** -1  7   8  10  13         39
            */


            treeDataList = new List <int>()
            {
                15, 25, 5, 12, 1, 9, 7, -1, 11, 30, 8, 10, 13, 28, 39
            };
            avlTree.Clear();
            avlTree.Insert(treeDataList);

            Console.WriteLine("************\r\n** AVL TREE:\r\n************\r\n");
            Console.WriteLine(avlTree.DrawTree());

            //
            // OUTPUT OF AVL TREE DRAWER

            /**
            **     ....9...
            **    /        \
            **    5       .12.
            **   / \     /    \
            **  1   7   11    25
            **  /   \   /    /  \
            ** -1    8 10   15   30
            **              /   / \
            **             13  28 39
            */

            Console.ReadLine();
        }//end-do-test
Exemple #3
0
        public void ClearTest(AVLTree <int> actualTree, AVLTree <int> expected)
        {
            actualTree.Clear();

            CollectionAssert.AreEqual(expected, actualTree);
        }
Exemple #4
0
 public virtual void Clear()
 {
     _wrapped.Clear();
 }
Exemple #5
0
        public void AddingAfterClearingTree()
        {
            var tree = new AVLTree <int>();

            int elementsCount = 100000;

            //Adding every seventh number, then every fifth number,
            //every third and at last all numbers
            for (int i = 7; i > 0; i -= 2)
            {
                int el = 0;
                while (el < elementsCount)
                {
                    if (!tree.Contains(el))
                    {
                        tree.Add(el);
                    }
                    el += i;
                }
            }

            if (tree.Count != elementsCount)
            {
                Assert.Fail();
            }

            tree.Clear();

            if (tree.Count != 0)
            {
                Assert.Fail();
            }

            //Adding every seventh number, then every fifth number,
            //every third and at last all numbers
            for (int i = 7; i > 0; i -= 2)
            {
                int el = 0;
                while (el < elementsCount)
                {
                    if (!tree.Contains(el))
                    {
                        tree.Add(el);
                    }
                    el += i;
                }
            }

            int  last              = -1;
            int  count             = 0;
            bool elementsAreSorted = true;

            foreach (var item in tree)
            {
                if (last > item)
                {
                    elementsAreSorted = false;
                }
                last = item;
                count++;
            }

            Assert.IsTrue(tree.Count == elementsCount &&
                          elementsAreSorted &&
                          count == elementsCount);
        }
Exemple #6
0
        public void ExecuteTestTree()
        {
            List <string> hashes = new List <string>();
            List <string> values = new List <string>();
            const int     size   = 1000;

            Console.WriteLine("Small Tests...");
            Assert.IsTrue(tree.Count == 0);
            tree.Add(new KeyValuePair <string, string>("key", "value"));
            Assert.IsTrue(tree.ContainsKey("key"));
            Assert.IsFalse(tree.ContainsKey("value"));
            Assert.IsTrue(tree["key"] == "value");
            Assert.IsTrue(tree.Count == 1);
            tree.Validate();
            tree.Add(new KeyValuePair <string, string>("key", "value2"));
            Assert.IsTrue(tree.ContainsKey("key"));
            Assert.IsFalse(tree.ContainsKey("value"));
            Assert.IsTrue(tree["key"] == "value2");
            Assert.IsTrue(tree.Count == 1);
            tree.Validate();
            tree.Add(new KeyValuePair <string, string>("key", "avalue"));
            Assert.IsTrue(tree.ContainsKey("key"));
            Assert.IsFalse(tree.ContainsKey("value"));
            Assert.IsTrue(tree["key"] == "avalue");
            Assert.IsTrue(tree.Count == 1);
            tree.Validate();
            Assert.IsFalse(tree.Remove("value"));
            Assert.IsTrue(tree.Remove("key"));
            tree.Validate();
            Assert.IsTrue(tree.Count == 0);
            tree.Add(new KeyValuePair <string, string>("key", "value2"));
            Assert.IsTrue(tree.Count == 1);
            tree.Clear();
            Assert.IsTrue(tree.Count == 0);
            tree.Add(new KeyValuePair <string, string>("key", "value"));
            Assert.IsTrue(tree.ContainsKey("key"));
            Assert.IsFalse(tree.ContainsKey("value"));
            Assert.IsTrue(tree["key"] == "value");
            Assert.IsTrue(tree.Count == 1);
            tree.Validate();
            tree.Clear();
            Assert.IsFalse(tree.Remove(""));
            Assert.IsFalse(tree.Remove(new KeyValuePair <string, string>("", "")));

            Console.WriteLine("Adding...");

            for (int i = 0; i < size; i++)
            {
                Assert.IsTrue(tree.Count == i);
                hashes.Add(Hash.GetHash());
                values.Add(Hash.GetHash());
                tree[hashes[i]] = values[i];
                Assert.IsTrue(tree[hashes[i]] == values[i]);
                Assert.IsTrue(tree.Keys.Contains(hashes[i]));
                Assert.IsTrue(tree.Values.Contains(values[i]));
                tree.Validate();
            }

            Console.WriteLine("Overriding...");

            for (int i = 0; i < size; i++)
            {
                Assert.IsTrue(tree[hashes[i]] == values[i]);
                values[i]       = Hash.GetHash();
                tree[hashes[i]] = values[i];
                Assert.IsTrue(tree.Count == size);
            }

            Console.WriteLine("Checking...");

            for (int i = 0; i < size; i++)
            {
                Assert.IsTrue(tree[hashes[i]] == values[i]);
                Assert.IsTrue(tree.Keys.Contains(hashes[i]));
                Assert.IsTrue(tree.Values.Contains(values[i]));
            }

            Console.WriteLine("Validating...");

            tree.Validate();

            Console.WriteLine("Deleting...");

            for (int i = 0; i < size; i++)
            {
                Assert.IsTrue(tree.Count == size - i);
                Assert.IsTrue(tree.ContainsKey(hashes[i]));
                Assert.IsTrue(tree[hashes[i]] != default(string));
                Assert.IsTrue(tree.Remove(hashes[i]));
                Assert.IsFalse(tree.Keys.Contains(hashes[i]));
                Assert.IsFalse(tree.Values.Contains(values[i]));

                if (true)
                {
                    for (int j = i + 1; j < size; j++)
                    {
                        Assert.IsFalse(tree[hashes[j]].Contains(hashes[j]));
                    }

                    for (int j = 0; j < i; j++)
                    {
                        Assert.IsFalse(tree.Remove(hashes[j]));
                    }
                }

                Assert.IsTrue(tree[hashes[i]] == default(string));
                tree.Validate();
            }

            Serializer.WriteXmlData(tree, nameof(tree));
            tree = Serializer.ReadXmlData <AVLTree <string, string> >(nameof(tree));

            tree.Validate();
        }
Exemple #7
0
 public void TestAvlTrees()
 {
     tree = new AVLTree <string, string>();
     ExecuteTestTree();
     tree.Clear();
 }
Exemple #8
0
 /// <summary>
 /// Clears the Subnodes of this node.
 /// </summary>
 public void ClearNodes()
 {
     _subNodes.Clear();
 }