Para empezar esto esta mal:
Código C++:
Ver originalptrNuevoArbol ptrDir = arbol;
(*ptrDir)->nodo = n;
Deberia ser:
ptrDir->nodo = n;
o
(*ptrDir).nodo = n;
La primera es una abreviacion de la segunda.
ptrDir es del tipo puntero a struct arbol_binario. En ella contiene un numero que representa una direccion de memoria.
Al usar el operador * estamos accediendo a la memoria que apunta y podemos tratarla como si fuese una variable de ese tipo.
Sobre la otra duda que comentaste en ese extenso parrafo no termine de entenderla. Lo unico que te digo *arbol no es un puntero es la estructura.