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>* 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;
    }