PointerProperty to node of material node tree
You cannot do this directly. With a PointerProperty you can only refer to a subclass of bpy.types.PropertyGroup or bpy.types.ID.
A Node is none of the above. Best way to solve this is to use a PointerProperty to point to the NodeTree (what is a subclass of bpy.types.ID) and use an additional bpy.props.StringProperty to select the specific node in that tree.
Note: Renaming the node will make the StringProperty Invalid.
Version 2.79
class MyPropertyGroup(bpy.types.PropertyGroup):
    material = bpy.props.PointerProperty(
        name=&quot;Material&quot;,
        type=bpy.types.Material,
    )
    node_name = bpy.props.StringProperty(
        default=&quot;&quot;,
        name=&quot;Node&quot;,
        description=&quot;Name of the node&quot;
    )
    @property
    def node(self):
        mat = self.material
        if mat:
            return mat.node_tree.nodes.get(self.node_name)


# draw function
def draw(self, context)
    layout = self.layout
    
    # NOTE: item is an instance of MyPropertyGroup

    layout.prop(item, &quot;material&quot;)
    node_selection_active = item.material is not None and item.material.use_nodes
    row = layout.row()
    row.enabled = node_selection_active
    if node_selection_active:
        row.prop_search(item, &quot;node_name&quot;, item.material.node_tree, &quot;nodes&quot;)
    else:
        row.prop(item, &quot;node_name&quot;)

Version 2.80+ (Use :instead of = for properties)
class MyPropertyGroup(bpy.types.PropertyGroup):
    material: bpy.props.PointerProperty(
        name=&quot;Material&quot;,
        type=bpy.types.Material,
    )
    node_name: bpy.props.StringProperty(
        default=&quot;&quot;,
        name=&quot;Node&quot;,
        description=&quot;Name of the node&quot;
    )
    @property
    def node(self):
        mat = self.material
        if mat:
            return mat.node_tree.nodes.get(self.node_name)


# draw function
def draw(self, context)
    layout = self.layout
    
    # NOTE: item is an instance of MyPropertyGroup

    layout.prop(item, &quot;material&quot;)
    node_selection_active = item.material is not None and item.material.use_nodes
    row = layout.row()
    row.enabled = node_selection_active
    if node_selection_active:
        row.prop_search(item, &quot;node_name&quot;, item.material.node_tree, &quot;nodes&quot;)
    else:
        row.prop(item, &quot;node_name&quot;)