code: def graph_nodes_from_subtree(self, node_source, include_root_node=False):
          
          if node_source in self._graph.nodes():
  
              # get all nodes that are member of a ring
              node_ring = []
              for ring in self.rings_nodes(include_root_node=include_root_node):
                  if node_source in ring:
                      node_ring = ring
                      break
  
              # result set
              nodes_subtree = set()
  
              # get nodes from subtree
              if node_source in node_ring:
                  for path in nx.shortest_path(self._graph, node_source).values():
                      if len(path)>1:
                          if (path[1] not in node_ring) and (path[1] is not self.station()):
                              nodes_subtree.update(path[1:len(path)])
              else:
                  raise ValueError(node_source, 'is not member of ring.')
  
          else:
              raise ValueError(node_source, 'is not member of graph.')
  
          return list(nodes_subtree)
docs: Finds all nodes of a tree that is connected to `node_source` and are (except `node_source`) not part of the 
          ring of `node_source` (traversal of graph from `node_source` excluding nodes along ring).
              
          Example
          -------
          A given graph with ring (edges) 0-1-2-3-4-5-0 and a tree starting at node (`node_source`) 3 with edges 3-6-7, 3-6-8-9 will return [6,7,8,9]
  
          Args
          ----
          node_source: GridDing0
              source node (Ding0 object), member of _graph
          include_root_node: bool, defaults to False
              If True, the root node is included in the list of ring nodes.
  
          Returns
          -------
          :any:`list` of :obj:`GridDing0`
              List of nodes (Ding0 objects)