// 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; } // Finding the smallest, which is the leftmost leaf (wrapper function) template bool BinarySearchTree::findSmallest(ItemType &returnedItem) const { BinaryNode *temp = nullptr; temp = _findSmallest(this->rootPtr, returnedItem); return temp != nullptr; } // Finding the biggest, which is the rightmost leaf (wrapper function) template bool BinarySearchTree::findLargest(ItemType &returnedItem) const { BinaryNode *temp = nullptr; temp = _findLargest(this->rootPtr, returnedItem); return temp != nullptr; } //////////////////////////// private functions //////////////////////////////////////////// // Implementation of the insert operation - iterative algorithm 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; } // Implementation to find the smallest: recursive template BinaryNode * BinarySearchTree::_findSmallest(BinaryNode *nodePtr, ItemType &smallest) const { if (nodePtr->getLeftPtr() == nullptr) { smallest = nodePtr->getItem(); return nodePtr; } return _findSmallest(nodePtr->getLeftPtr(), smallest); } // Implementation to find the largest: recursive template BinaryNode *BinarySearchTree::_findLargest(BinaryNode *nodePtr, ItemType &biggest) const { if (nodePtr->getRightPtr() == nullptr) { biggest = nodePtr->getItem(); return nodePtr; } return _findLargest(nodePtr->getRightPtr(), biggest); } #endif