I couldn't help but notice that you never destroy from anywhere but the root.
Code:
template <class T> struct node
{
        T element;
        node<T> * left;
        node<T> * right;
};

template <class T> class BST
{
public:     
        BST();
        ~BST();
        //display(node<T> * = root);  
             // -- consider returning an std::string or having it take a stream reference as a parameter
        void destroy(node<T> *& troot = root);
        void insert(T newElement, node<T> *& troot = root);
        int remove(T oldElement, node<T> *& troot = root);
        const int population() { return num_in_tree; }
private:
        node<T> * root;
        int num_in_tree;
        node<T> * inorderSuccessor(node<T> *& troot);
        int children(node<T> * troot);
       
};