// Binary Search Tree ADT // Created by Iurii Tatishchev // Modified by: Iurii Tatishchev #ifndef _BINARY_SEARCH_TREE #define _BINARY_SEARCH_TREE #include "BinaryTree.h" template class BinarySearchTree : public BinaryTree { public: // insert a node at the correct location bool insert(const ItemType &item); // remove a node if found //bool remove(const ItemType &item); // find a target node //bool search(const ItemType &target, ItemType &returnedItem) const; // find the smallest node //bool findSmallest(ItemType &returnedItem) const; // find the largest node //bool findLargest(ItemType &returnedItem) const; private: // internal insert node: insert newNode in nodePtr subtree BinaryNode *_insert(BinaryNode *nodePtr, BinaryNode *newNode); // search for target node //BinaryNode* _search(BinaryNode* treePtr, const ItemType &target) const; // find the smallest node //BinaryNode* _findSmallest(BinaryNode* nodePtr, ItemType &smallest) const; // find the biggest node //BinaryNode* _findLargest(BinaryNode* nodePtr, ItemType &smallest) const; // internal remove node: locate and delete target node under nodePtr subtree // BinaryNode* _remove(BinaryNode* nodePtr, const ItemType target, bool &success); // delete target node from tree, called by internal remove node //BinaryNode* _removeNode(BinaryNode* targetNodePtr); // remove the leftmost node in the left subtree of nodePtr //BinaryNode* _removeLeftmostNode(BinaryNode* nodePtr, ItemType &successor); }; ///////////////////////// public function definitions /////////////////////////// //Inserting items within a tree template bool BinarySearchTree::insert(const ItemType &newEntry) { BinaryNode *newNodePtr = new BinaryNode(newEntry); this->rootPtr = _insert(this->rootPtr, newNodePtr); return true; } //////////////////////////// private functions //////////////////////////////////////////// //Implementation of the insert operation template BinaryNode *BinarySearchTree::_insert(BinaryNode *nodePtr, BinaryNode *newNodePtr) { BinaryNode *pWalk = nodePtr, *parent = nullptr; if (!nodePtr) // == NULL { nodePtr = newNodePtr; return nodePtr; } else { while (pWalk) // != NULL { 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; } #endif