void BST::deleteMin() { if (rootPtr->getLeftChildPtr()==nullptr && rootPtr->getRightChildPtr()!=nullptr) { BinaryNode* toDelete = rootPtr-> getRightChildPtr(); rootPtr = rootPtr-> getRightChildPtr(); delete toDelete; } else if (rootPtr->getLeftChildPtr()==nullptr) { delete rootPtr; } else { BinaryNode* parent = rootPtr; BinaryNode* child = rootPtr->getLeftChildPtr(); while (child->getLeftChildPtr()!=nullptr) { child = child->getLeftChildPtr(); parent = parent->getLeftChildPtr(); } delete child; parent->setLeftChildPtr(nullptr); } }
BinaryNode<ItemType>* copyTree(const BinaryNode<ItemType>* treePtr) const { BinaryNode<ItemType>* newTreePtr = nullptr; if (treePtr != nullptr) { newTreePtr = new BinaryNode<ItemType>(treePtr->getItem(), nullptr, nullptr); newTreePtr->setLeftChildPtr(copyTree(treePtr->getLeftChildPtr())); newTreePtr->setRightChildPtr(copyTree(treePtr->getRightChildPtr())); } return newTreePtr; }
BinaryNode<ItemType>* leftRotate(BinaryNode<ItemType>* x) { BinaryNode<ItemType>* y = x->getRightChildPtr(); BinaryNode<ItemType>* T2 = y->getLeftChildPtr(); y->setLeftChildPtr(x); x->setRightChildPtr(T2); x->setHeight(max(height(x->getLeftChildPtr()), height(x->getRightChildPtr()))+1); y->setHeight(max(height(y->getLeftChildPtr()), height(y->getRightChildPtr()))+1); return y; }
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::copyTree(const BinaryNode<ItemType>* treePtr) const { BinaryNode<ItemType>* newTreePtr = nullptr; // Copy tree nodes during a preorder traversal if (treePtr != nullptr) { // Copy node newTreePtr = new BinaryNode<ItemType>(treePtr->getItem(), nullptr, nullptr); newTreePtr->setLeftChildPtr(copyTree(treePtr->getLeftChildPtr())); newTreePtr->setRightChildPtr(copyTree(treePtr->getRightChildPtr())); } // end if return newTreePtr; } // end copyTree
void BST::remove(int x) { /*Couple cases of removing an item *1. Removing the root *2. Removing a leaf *3. Removing something in the middle */ //1 if (rootPtr->getItem()==x) { BinaryNode* toDelete = rootPtr; rootPtr = rootPtr->getLeftChildPtr(); BinaryNode* rightChild = rootPtr->getRightChildPtr(); BinaryNode* leftChild = rootPtr->getLeftChildPtr(); delete toDelete; while (leftChild->getrightChildPtr()!=nullptr)//keeps traversing down { leftChild = leftChild->getRightChildPtr(); } leftChild = leftChild->setRightChildPtr(rightChild); } else { BinaryNode* parent = search(x, rootPtr, rootPtr); int dir; if (parent->getrightChildPtr()==x) { BinaryNode* toDelete = parent->getrightChildPtr(); dir =0; } else { BinaryNode* toDelete = parent->getLeftChildPtr(); dir=1; } //Now we encounter our next two cases: //2. if it's a leaf if (toDelete->getrightChildPtr==nullptr && toDelete->getLeftChildPtr==nullptr) { delete toDelete; if (dir==0) { parent->setRightChildPtr(nullptr); } else { parent->setLeftChildPtr(nullptr); } } //3. Something in the middle BinaryNode* leftChild = toDelete->getLeftChildPtr(); BinaryNode* rightChild = toDelete->getRightChildPtr(); } }