template class TreeNode { public: T key; TreeNode* left; TreeNode* right; // constructor TreeNode(const T& k) { key = k; left = NULL; right = NULL; } }; // internally it's a binary search tree template class ds_set { public: ds_set(){ root = NULL; m_size = 0; } int size() { return m_size; } bool find(const T& key){ return find(key, root); } void insert(const T& key){ if(insert(key, root) == true){ ++m_size; } } private: TreeNode* root; int m_size; bool find(const T& key, TreeNode* root); bool insert(const T& key, TreeNode*& root); }; template bool ds_set::find(const T& key, TreeNode* root){ // base case (if root doesn't even exist) if(root == NULL){ return false; } // general case if(key < root->key){ return find(key, root->left); }else if(key > root->key){ return find(key, root->right); }else{ return true; } } template bool ds_set::insert(const T& key, TreeNode*& root){ // base case (if root doesn't even exist) if(root == NULL){ // make the first node. root = new TreeNode(key); return true; } // general case if(key < root->key){ return insert(key, root->left); }else if(key > root->key){ return insert(key, root->right); }else{ return false; } }