I'm having trouble implementing the CLRS method for a Red Black Tree. I'm not able to successful insert and I don't know what I'm doing wrong. I struggle with pointers and it's a topic I'm trying to learn more about (I'm buying a book on Amazon this weekend to learn more). Please help me pin point errors. I'm not receiving error messages, but my code won't run past my RBTInsert function, so I know it's getting stuck there. I call RBT Insert in another function that's not shown, but I didn't show it because I'm convinced my errors are in my pointers and nodes.
enum Color {RED, BLACK};
template <typename T>
struct Node
{
    T data;
    bool color;
    Node<T>* left = nullptr;
    Node<T>* right = nullptr;
    Node<T>* p = nullptr; //p is parent
}
template <typename T>
class RBT
{
private:
    Node<T>* root;
    
    void RotateLeft(Node<T>*, Node<T>*);
    void RotateRight(Node<T>*, Node<T>*);
    void RBTFixUp(Node<T>*, Node<T>*);
    void MakeEmpty(Node<T>* root);
public:
    RBT(): root(nullptr){}
    ~RBT();
    void RBTInsert(Node<T>* &root, T data);
};
template <typename T>
void RBT<T>::MakeEmpty(Node<T>* root)
{
    while (root != nullptr)
    {
        delete root;
        MakeEmpty(root->left);
        MakeEmpty(root->right);
    }
}
template <typename T>
RBT<T>::~RBT()
{
    MakeEmpty(root);
}
template <typename T>
void RBT<T>::RotateLeft(Node<T>* root, Node<T>* x)
{
    Node<T>* y = x->right;
    x->right = y->left;
    if (y->left != nullptr)
        y->left->p = x;
    y->p = x->p;
    if (x->p == nullptr)
        root = y;
    else if (x == x->p->left)
        x->p->left = y;
    else
        x->p->right = y;
    y->left = x;
    x->p = y;
}
template <typename T>
void RBT<T>::RotateRight(Node<T>* root, Node<T>* x)
{
    Node<T>* y = x->left;
    x->left = y->right;
    if (y->right != nullptr)
        y->right->p = x;
    y->p = x->p;
    if (x->p == nullptr)
        root = y;
    else if (x == x->p->right)
        x->p->right = y;
    else
        x->p->left = y;
    y->right= x;
    x->p = y;
}
template <typename T>
void RBT<T>::RBTFixUp(Node<T>* root, Node<T>* z)
{
    while (z->p->color == RED)
    {
        if (z->p == z->p->p->left)
        {
            Node<T>* y = z->p->p->right;
            if(y->color == RED)
            {
                z->p->color = BLACK;
                y->color = BLACK;
                z->p->p->color = RED;
                z = z->p->p;
            }else if (z == z->p->right)
            {
                z = z->p;
                RotateLeft(root,z);
            }
        }else
        {
            Node<T>* y = z->p->p->left;
            if(y->color == RED)
            {
                z->p->color = BLACK;
                y->color = BLACK;
                z->p->p->color = RED;
                z = z->p->p;
            }else if (z == z->p->left)
            {
                z = z->p;
                RotateRight(root,z);
            }
        }
    }
}
template <typename T>
void RBT<T>::RBTInsert(Node<T>* &root, T data)
{
     Node<T>* z = nullptr;
     z->data = data;
     Node<T>* y = nullptr;
     Node<T>* x = nullptr;
     while (x != nullptr)
     {
        y = x;
        if (z->data < x->data)
            x = x->left;
        else
            x = x->right;
     }
    z->p = y;
    if (y == nullptr)
        root = z;
    else if (z->data < y->data)
        y->left = z;
    else
        y->right = z;
    z->left = nullptr;
    z->right = nullptr;
    z->color = RED;
    RBTFixUp(root,z);
}
