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;
    }
Ejemplo n.º 3
0
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();
    }

}