BinaryNode<ItemType>* rightRotate(BinaryNode<ItemType>* y) { BinaryNode<ItemType>* x = y->getLeftChildPtr(); BinaryNode<ItemType>* T2 = x->getRightChildPtr(); x->setRightChildPtr(y); y->setLeftChildPtr(T2); y->setHeight(max(height(y->getLeftChildPtr()), height(y->getRightChildPtr()))+1); x->setHeight(max(height(x->getLeftChildPtr()), height(x->getRightChildPtr()))+1); return x; }
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; }
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(); } }