// Average: O(log(n)) time | O(1) space
            // Worst: O(n) time | O(1) space
            public BSTConstruction Insert(int value)
            {
                BSTConstruction currentNode = this;

                while (true)
                {
                    if (value < currentNode.value)
                    {
                        if (currentNode.left == null)
                        {
                            BSTConstruction newNode = new BSTConstruction(value);
                            currentNode.left = newNode;
                            break;
                        }
                        else
                        {
                            currentNode = currentNode.left;
                        }
                    }
                    else
                    {
                        if (currentNode.right == null)
                        {
                            BSTConstruction newNode = new BSTConstruction(value);
                            currentNode.right = newNode;
                            break;
                        }
                        else
                        {
                            currentNode = currentNode.right;
                        }
                    }
                }
                return(this);
            }
            public void Remove(int value, BSTConstruction parentNode)
            {
                BSTConstruction currentNode = this;

                while (currentNode != null)
                {
                    if (value < currentNode.value)
                    {
                        parentNode  = currentNode;
                        currentNode = currentNode.left;
                    }
                    else if (value > currentNode.value)
                    {
                        parentNode  = currentNode;
                        currentNode = currentNode.right;
                    }
                    else
                    {
                        if (currentNode.left != null && currentNode.right != null)
                        {
                            currentNode.value = currentNode.right.getMinValue();
                            currentNode.right.Remove(currentNode.value,
                                                     currentNode);
                        }
                        else if (parentNode == null)
                        {
                            if (currentNode.left != null)
                            {
                                currentNode.value = currentNode.left.value;
                                currentNode.right = currentNode.left.right;
                                currentNode.left  = currentNode.left.left;
                            }
                            else if (currentNode.right != null)
                            {
                                currentNode.value = currentNode.right.value;
                                currentNode.left  = currentNode.right.left;
                                currentNode.right = currentNode.right.right;
                            }
                            else
                            {
                                currentNode.value = 0;
                            }
                        }
                        else if (parentNode.left == currentNode)
                        {
                            parentNode.left = currentNode.left !=
                                              null ? currentNode.left :
                                              currentNode.right;
                        }
                        else if (parentNode.right == currentNode)
                        {
                            parentNode.right = currentNode.left !=
                                               null ? currentNode.left :
                                               currentNode.right;
                        }
                        break;
                    }
                }
            }
            // Average: O(log(n)) time | O(1) space
            // Worst: O(n) time | O(1) space
            public bool Contains(int value)
            {
                BSTConstruction currentNode = this;

                while (currentNode != null)
                {
                    if (value < currentNode.value)
                    {
                        currentNode = currentNode.left;
                    }
                    else if (value > currentNode.value)
                    {
                        currentNode = currentNode.right;
                    }
                    else
                    {
                        return(true);
                    }
                }
                return(false);
            }