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); };