public void TestAdd()
        {
            LoopBinarySearchTree<int> tree = new LoopBinarySearchTree<int>();

            TreeNode<int> node1 = new TreeNode<int>(1);
            TreeNode<int> node2 = new TreeNode<int>(2);
            TreeNode<int> node3 = new TreeNode<int>(3);
            TreeNode<int> node4 = new TreeNode<int>(4);

            tree.Add(node4.Value);
            tree.Add(node2.Value);
            tree.Add(node3.Value);
            tree.Add(node1.Value);

            TreeNode<int> node5 = new TreeNode<int>(5);
            TreeNode<int> node6 = new TreeNode<int>(6);
            TreeNode<int> node7 = new TreeNode<int>(7);
            TreeNode<int> node8 = new TreeNode<int>(8);

            tree.Add(node6.Value);
            tree.Add(node5.Value);
            tree.Add(node8.Value);
            tree.Add(node7.Value);

            TreeNode<int> testNode = tree.FindNode(node2.Value);

            Assert.IsNotNull(testNode, "Couldn't find test node");
            Assert.AreEqual(testNode.Value.CompareTo(node2.Value), 0, "Test node does not match value");
            Assert.IsNotNull(testNode.LeftNode, "LeftNode is null");
            Assert.IsNotNull(testNode.RightNode, "Right node is null");

            TreeNode<int> leftNode = testNode.LeftNode;
            TreeNode<int> rightNode = testNode.RightNode;

            Assert.AreEqual(leftNode.Value.CompareTo(node1.Value), 0, "left node does not match expected value");
            Assert.AreEqual(rightNode.Value.CompareTo(node3.Value), 0, "right node does not match expected value");

            Assert.AreEqual(leftNode.ParentNode.Value.CompareTo(node2.Value), 0);
            Assert.AreEqual(rightNode.ParentNode.Value.CompareTo(node2.Value), 0);

            testNode = tree.FindNode(node6.Value);

            Assert.IsNotNull(testNode, "Couldn't find test node");
            Assert.AreEqual(testNode.Value.CompareTo(node6.Value), 0, "Test node does not match value");
            Assert.IsNotNull(testNode.LeftNode, "LeftNode is null");
            Assert.IsNotNull(testNode.RightNode, "Right node is null");

            leftNode = testNode.LeftNode;
            rightNode = testNode.RightNode;

            Assert.AreEqual(leftNode.Value.CompareTo(node5.Value), 0, "left node does not match expected value");
            Assert.AreEqual(rightNode.Value.CompareTo(node8.Value), 0, "right node does not match expected value");

            Assert.AreEqual(leftNode.ParentNode.Value.CompareTo(node6.Value), 0);
            Assert.AreEqual(rightNode.ParentNode.Value.CompareTo(node6.Value), 0);
        }
        private LoopBinarySearchTree<int> ConstructTree()
        {
            LoopBinarySearchTree<int> tree = new LoopBinarySearchTree<int>();

            TreeNode<int> node1 = new TreeNode<int>(1);
            TreeNode<int> node2 = new TreeNode<int>(2);
            TreeNode<int> node3 = new TreeNode<int>(3);
            TreeNode<int> node4 = new TreeNode<int>(4);

            tree.Add(node4.Value);
            tree.Add(node2.Value);
            tree.Add(node3.Value);
            tree.Add(node1.Value);

            TreeNode<int> node5 = new TreeNode<int>(5);
            TreeNode<int> node6 = new TreeNode<int>(6);
            TreeNode<int> node7 = new TreeNode<int>(7);
            TreeNode<int> node8 = new TreeNode<int>(8);

            tree.Add(node6.Value);
            tree.Add(node5.Value);
            tree.Add(node8.Value);
            tree.Add(node7.Value);

            return tree;
        }
        public void LoopedPostOrderTraversalTest()
        {
            LoopBinarySearchTree<int> tree = new LoopBinarySearchTree<int>();

            TreeNode<int> node1 = new TreeNode<int>(1);
            TreeNode<int> node2 = new TreeNode<int>(2);
            TreeNode<int> node3 = new TreeNode<int>(3);
            TreeNode<int> node4 = new TreeNode<int>(4);

            tree.Add(node4.Value);
            tree.Add(node2.Value);
            tree.Add(node3.Value);
            tree.Add(node1.Value);

            TreeNode<int> node5 = new TreeNode<int>(5);
            TreeNode<int> node6 = new TreeNode<int>(6);
            TreeNode<int> node7 = new TreeNode<int>(7);
            TreeNode<int> node8 = new TreeNode<int>(8);

            tree.Add(node6.Value);
            tree.Add(node5.Value);
            tree.Add(node8.Value);
            tree.Add(node7.Value);

            TreeNode<int>[] nodeArray = new TreeNode<int>[tree.Count];
            int index = 0;

            nodeArray[index] = node1;
            index++;
            nodeArray[index] = node3;
            index++;
            nodeArray[index] = node2;
            index++;
            nodeArray[index] = node5;
            index++;

            nodeArray[index] = node7;
            index++;
            nodeArray[index] = node8;
            index++;
            nodeArray[index] = node6;
            index++;
            nodeArray[index] = node4;

            IEnumerator<int> enumerator = tree.PostOrderTraversal();

            for (index = 0; index < tree.Count; index++)
            {
                enumerator.MoveNext();
                int nextNode = enumerator.Current;
                Assert.AreEqual(nodeArray[index].Value.CompareTo(nextNode), 0, string.Format("Expected {0} Actual {1}", nodeArray[index].Value, nextNode));
            }
        }