protected override IBinaryTreeNode <ValueType> Remove(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer)
 {
     return(Balance(base.Remove(node, value, prefer)));
 }
        protected virtual IBinaryTreeNode <ValueType> Remove(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer)
        {
            if (node == null)
            {
                return(null);
            }
            int result = value.CompareTo(node.value);

            if (result < 0)
            {
                node.SetLeftChild(Remove(node.leftChild, value, prefer));
            }
            else if (result > 0)
            {
                node.SetRightChild(Remove(node.rightChild, value, prefer));
            }
            else
            {
                if (node.leftChild != null && node.rightChild != null)
                {
                    if (prefer == RemovePrefer.Left)
                    {
                        RemoveLeft(node, value, prefer);
                    }
                    else if (prefer == RemovePrefer.Right)
                    {
                        RemoveRight(node, value, prefer);
                    }
                    else
                    {
                        return(null);
                    }
                }
                else if (node.leftChild != null && node.rightChild == null)
                {
                    RemoveLeft(node, value, prefer);
                }
                else if (node.leftChild == null && node.rightChild != null)
                {
                    RemoveRight(node, value, prefer);
                }
                else
                {
                    return(null);
                }
            }
            return(node);
        }
        protected virtual IBinaryTreeNode <ValueType> RemoveRight(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer)
        {
            IBinaryTreeNode <ValueType> rightMin = FindMin(node.rightChild);

            node.value = rightMin.value;
            node.SetRightChild(Remove(node.rightChild, node.value, prefer));
            return(node);
        }
 public virtual void Remove(ValueType value, RemovePrefer prefer)
 {
     head = Remove(head, value, prefer);
 }
        protected virtual IBinaryTreeNode <ValueType> RemoveLeft(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer)
        {
            IBinaryTreeNode <ValueType> leftMax = FindMax(node.leftChild);

            node.value = leftMax.value;
            node.SetLeftChild(Remove(node.leftChild, node.value, prefer));
            return(node);
        }