public void Remove(int value)
        {
            if (this.rootNode == null)
            {
                return;
            }
            var        currentNode = this.rootNode;
            BinaryNode parentNode  = new BinaryNode();

            while (currentNode != null)
            {
                if (value < currentNode.Value)
                {
                    parentNode  = currentNode;
                    currentNode = currentNode.LeftNode;
                }
                else if (value > currentNode.Value)
                {
                    parentNode  = currentNode;
                    currentNode = currentNode.RightNode;
                }
                else if (currentNode.Value == value)
                {
                    if (currentNode.RightNode == null)
                    {
                        if (parentNode == null)
                        {
                            this.rootNode = currentNode.LeftNode;
                        }
                        else
                        {
                            if (currentNode.Value < parentNode.Value)
                            {
                                parentNode.LeftNode = currentNode.LeftNode;
                            }
                            else if (currentNode.Value > parentNode.Value)
                            {
                                parentNode.RightNode = currentNode.LeftNode;
                            }
                        }
                    }
                    else if (currentNode.RightNode.LeftNode == null)
                    {
                        if (parentNode == null)
                        {
                            this.rootNode = currentNode.LeftNode;
                        }
                        else
                        {
                            currentNode.RightNode.LeftNode = currentNode.LeftNode;
                            if (currentNode.Value < parentNode.Value)
                            {
                                parentNode.LeftNode = currentNode.RightNode;
                            }
                            else if (currentNode.Value > parentNode.Value)
                            {
                                parentNode.RightNode = currentNode.RightNode;
                            }
                        }
                    }
                    else
                    {
                        var leftmost       = currentNode.RightNode.LeftNode;
                        var leftmostParent = currentNode.RightNode;
                        while (leftmost.LeftNode != null)
                        {
                            leftmostParent = leftmost;
                            leftmost       = leftmost.LeftNode;
                        }
                        leftmostParent.LeftNode = leftmost.RightNode;
                        leftmost.LeftNode       = currentNode.LeftNode;
                        leftmost.RightNode      = currentNode.RightNode;

                        if (parentNode == null)
                        {
                            this.rootNode = leftmost;
                        }
                        else
                        {
                            if (currentNode.Value < parentNode.Value)
                            {
                                parentNode.LeftNode = leftmost;
                            }
                            else if (currentNode.Value > parentNode.Value)
                            {
                                parentNode.RightNode = leftmost;
                            }
                        }
                    }
                }
            }
        }
 public BinarySearchTree()
 {
     this.rootNode = null;
 }