Q:

Do not understand something about pointers

So I did already manage to solve my problem but I have trouble understanding what exactly was the problem. My code before was:
BinaryTree removePrivate(int x, BinaryTree *node)
{
    if ((*node).m_key < x)
        *(*node).m_right = removePrivate(x, (*node).m_right);
    else if ((*node).m_key > x)
        *(*node).m_left = removePrivate(x, (*node).m_left);
    else
        node= NULL ;
    return *node;
}

It compiles just fine but things go to hell when it gets called.  Access violation at return *node;
I have changed it to:
[*]= * has been added, [ ]= * has been removed
BinaryTree [*]removePrivate(int x, BinaryTree *node)
{
    if ((*node).m_key < x)
        [ ](*node).m_right = removePrivate(x, (*node).m_right);
    else if ((*node).m_key > x)
        [ ](*node).m_left = removePrivate(x, (*node).m_left);
    else
        node= NULL ;
    return [ ]node;
}

Now everything works just fine but I am really not 100% sure why this is better.

A:

When you write (*node), you are dereferencing the pointer node. If you use *(*node), as you originally had, you are dereferencing (*node), which is the dereferenced  node. Thus, you are dereferencing twice, which does not make sense because node because points to a BinaryTree object, not another pointer.
In a simpler form:
*node = dereference node
*(*node) = dereference *node = dereference node twice

