Бинарное дерева поиска, удаление, С++

Помогите разобраться с удалением корня бинарного дерева поиска. У меня программа вылетает при удалении корня. Остальное работает

template<class T>
Node<T>* Tree<T>::deleteNode(Node<T>* node, T val)
{
    if (root == nullptr)
    {
        cout << "No data in this tree" << endl;
        return nullptr;
    }
    if (node == nullptr)
    {
        cout << "Data not found!" << endl;
        return node;
    }
    if (val == node->getData()) 
    {
        Node<T>* tmp = root;
        if (node->getRight() == nullptr)
            tmp = node->getLeft();
        else {
            Node<T>* ptr = node->getRight();
            if (ptr->getLeft() == nullptr) 
            {
                ptr->setLeft(node->getLeft());
                tmp = ptr;
            }
            else 
            {

                Node<T>* pmin = ptr->getLeft();
                while (pmin->getLeft() != nullptr) 
                {
                    ptr = pmin;
                    pmin = ptr->getLeft();
                }
                ptr->setLeft(pmin->getRight());
                pmin->setLeft(node->getLeft());
                pmin->setRight(node->getRight());
                tmp = pmin;
            }
        }
        delete node;
        return tmp;
    }
    else if (val < node->getData())
        node->setLeft(deleteNode(node->getLeft(), val));
    else
        node->setRight(deleteNode(node->getRight(), val));
    return node;
}

template<class T>
void Tree<T>::deleteNode(T val)
{
    auto cur = root;
    Node<T>* target = deleteNode(cur, val);
}

напиши в какой строке и с какой ошибкой вылетает.

Что-то тут запутанно всё, я бы погуглил алгоритм/реализации для сравнения, ну и заодно может быть получится упростить код )

гугл “bst delete node”

Или еще если всё правильно, то может быть в коде основной программы есть попытки сделать что-то с удаленным корнем. Особенно если он не становится null.