Hola, gracias por la respuesta, el uso de punteros esta bien y funciona, el problema era en la función TreeContains(), ese metodo estaba mal por las siguientes razones:
 
   1. Primero compruebas si es la raiz, de ser correcto retornas el nodo. 
   2. Si no es la raiz, compruebas que si es el izquierdo, el del medio o el derecho.   El problema es que si no es ninguno de ellos, retornas NULL y no estas caminando por dentro del arbol. 
lo he arreglado y lo he solucionado, pongo a disposicion el codigo del método TreeContains(). 
saludos
Cronos  
Código:
 TreeNode* SkillTree::treeContains( TreeNode *root, char* parentName ) {	
     if (root==NULL) {
        return NULL;
    }
	 if ( strcmp(parentName, root->item->getName())==0 ) {     
        return root;
    }
	 if ( root->left!=NULL ) 
	{
        TreeNode * aux= treeContains( root->left, parentName );
        if(aux!=NULL)
            return aux;
    }
	 if (root->middle !=NULL )  {
		 TreeNode * aux= treeContains( root->middle, parentName );
		
		if(aux!=NULL)
            return aux;
    }
	 if (root->right!=NULL ) {
        TreeNode * aux= treeContains( root->right, parentName );
        
        if(aux!=NULL)
            return aux;         
    }
	return NULL;
}