'How can I delete a node from Binary search tree in C with 2 children

I am trying to create a function that deletes a node from a binary search tree my problem is whenever I delete a root node that has two children it will work but if I insert a node again there is an error in allocating memory(malloc) for the newly added node. I have tried using a debugger it will stuck in malloc and it doesn't tell me why.

Here is my function in deleting a node from the bst

bool delete_node(node * n, int data)
{
if(n == NULL)
    return false;

if (n->data == data)
{
    if(n->left == NULL && n->right == NULL)
    {
        free(n);
        n->empty = true;
        return true;
    }
    else if(n->left != NULL && n->right == NULL)
    {
        node * temp = n;
        n = n->left;
        free(temp);

        temp->empty = true;
        return true;
    }
    else if(n->left == NULL && n->right != NULL)
    {
        node * temp = n;
        n = n->right;
        free(temp);

        temp->empty = true;
        return true;
    }
    else
    {
        nodelist * inorder_seq = create_nodelist();
        get_inorder_seq(inorder_seq, n);

        node * ps = get_predecessor(inorder_seq, n);
        if(ps == NULL)
            ps = get_successor(inorder_seq, n);
        
        int temp_data = n->data;
        n->data = ps->data;

        free(inorder_seq->list);
        free(inorder_seq);

        if(temp_data > n->data)
            return delete_node(n->left, ps->data);
        else
            return delete_node(n->right, ps->data);

    }
}
else if(n->data < data)
    return delete_node(n->right, data);
else if(n->data > data)
    return delete_node(n->left, data);

}

Here is my function in inserting a new node

void insert_node(node * root, int data)
{

node * newnode = create_node(data);
recur_insert_node(root, newnode);

}

Here is the function for the recursion of inserting a new node

void recur_insert_node(node * n, node * newnode)
{
   if(n->data > newnode->data)
   {
    if(n->left == NULL || n->left->empty)
    {
        n->left = newnode;
        n->left->empty = false;
    }
    else
    {
        recur_insert_node(n->left, newnode);
    }
}
else if(n->data < newnode->data || n->right->empty)
{
    if(n->right == NULL)
    {
        n->right = newnode;
        n->right->empty = false;
    }
    else
    {
        recur_insert_node(n->right, newnode);
    }

} }

here is my node struct

typedef struct _node
{
int data;
struct _node * left;
struct _node * right;
bool empty;

}node;


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source