diff --git a/lectures/18_trees_I/ds_set_starter.h b/lectures/18_trees_I/ds_set_starter.h index 91117cb..b4fea8e 100644 --- a/lectures/18_trees_I/ds_set_starter.h +++ b/lectures/18_trees_I/ds_set_starter.h @@ -1,79 +1,73 @@ -// Partial implementation of binary-tree based set class similar to std::set. -// The iterator increment & decrement operations have been omitted. -#ifndef ds_set_h_ -#define ds_set_h_ -#include -#include - -// ------------------------------------------------------------------- -// TREE NODE CLASS template class TreeNode { public: - TreeNode() : left(NULL), right(NULL) {} - TreeNode(const T& init) : value(init), left(NULL), right(NULL) {} - T value; - TreeNode* left; - TreeNode* right; + T key; + TreeNode* left; + TreeNode* right; + // constructor + TreeNode(const T& k) { + key = k; + left = NULL; + right = NULL; + } }; -template class ds_set; - -// ------------------------------------------------------------------- -// TREE NODE ITERATOR CLASS -template -class tree_iterator { -public: - tree_iterator() : ptr_(NULL) {} - tree_iterator(TreeNode* p) : ptr_(p) {} - tree_iterator(const tree_iterator& old) : ptr_(old.ptr_) {} - ~tree_iterator() {} - tree_iterator& operator=(const tree_iterator& old) { ptr_ = old.ptr_; return *this; } - // operator* gives constant access to the value at the pointer - const T& operator*() const { return ptr_->value; } - // comparison operators are straightforward - bool operator==(const tree_iterator& r) { return ptr_ == r.ptr_; } - bool operator!=(const tree_iterator& r) { return ptr_ != r.ptr_; } - -private: - // representation - TreeNode* ptr_; -}; - -// ------------------------------------------------------------------- -// DS SET CLASS +// internally it's a binary search tree template class ds_set { public: - ds_set() : root_(NULL), size_(0) {} - ds_set(const ds_set& old) : size_(old.size_) { - root_ = this->copy_tree(old.root_); } - ~ds_set() { this->destroy_tree(root_); root_ = NULL; } - ds_set& operator=(const ds_set& old) { - if (&old != this) { - this->destroy_tree(root_); - root_ = this->copy_tree(old.root_); - size_ = old.size_; - } - return *this; - } - - typedef tree_iterator iterator; - iterator find(const T& key_value) { return find(key_value, root_); } - std::pair< iterator, bool > insert(T const& key_value) { return insert(key_value, root_); } - // ITERATORS - iterator begin() const { - } - - iterator end() const { return iterator(NULL); } - -private: - // REPRESENTATION - TreeNode* root_; - int size_; - iterator find(const T& key_value, TreeNode* p) { /* to be implemented */ } - std::pair insert(const T& key_value, TreeNode*& p) { /* to be implemented */ } - void destroy_tree(TreeNode* p) { /* to be implemented */ } + 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); }; -#endif +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; + } +}