#ifndef INC_08_TEAM_PROJECT_BINARYSEARCHTREE_H #define INC_08_TEAM_PROJECT_BINARYSEARCHTREE_H #include "BinaryTree.h" template class BinarySearchTree: public BinaryTree { private: BinaryTreeNode* _insert(BinaryTreeNode* nodePtr, BinaryTreeNode* newNode); BinaryTreeNode* _search(BinaryTreeNode* treePtr, const T& target) const; //BinaryNode* _remove(BinaryNode* nodePtr, const ItemType target, bool& success); public: void insert(const T& item); void remove(const T &item) { throw std::logic_error("Not implemented: BinarySearchTree.remove()"); }; bool search(const T& target, T& returnedItem) const; }; template void BinarySearchTree::insert(const T& newEntry) { BinaryTreeNode* newNodePtr = new BinaryTreeNode(newEntry); this->root = _insert(this->root, newNodePtr); this->size++; } template BinaryTreeNode* BinarySearchTree::_insert(BinaryTreeNode* nodePtr, BinaryTreeNode* newNodePtr) { BinaryTreeNode* pWalk = nodePtr, * parent = nullptr; if (!nodePtr) { nodePtr = newNodePtr; return nodePtr; } else { while (pWalk) { parent = pWalk; if (pWalk->getItem() > newNodePtr->getItem()) pWalk = pWalk->getLeftPtr(); else pWalk = pWalk->getRightPtr(); } if (parent->getItem() > newNodePtr->getItem()) parent->setLeftPtr(newNodePtr); else parent->setRightPtr(newNodePtr); } return nodePtr; } template bool BinarySearchTree::search(const T& target, T& returnedItem) const { BinaryTreeNode* temp = nullptr; temp = _search(this->root, target); if (temp) { returnedItem = temp->getItem(); return true; } return false; } template BinaryTreeNode* BinarySearchTree::_search(BinaryTreeNode* nodePtr, const T& target) const { BinaryTreeNode* found = nullptr; if (nodePtr) { if (target == nodePtr->getItem()) found = nodePtr; else if (target < nodePtr->getItem()) found = _search(nodePtr->getLeftPtr(), target); else found = _search(nodePtr->getRightPtr(), target); } return found; } #endif //INC_08_TEAM_PROJECT_BINARYSEARCHTREE_H