code: def _internal_build(self):
          
          self.nodes = self.__tree.Nodes()
          self.edges = self.__tree.Edges()
          self.augmentedEdges = {}
          for key, val in self.__tree.AugmentedEdges().items():
              self.augmentedEdges[key] = list(val)
          self.root = self.__tree.Root()
  
          seen = set()
          self.branches = set()
  
          # Find all of the branching nodes in the tree, degree > 1
          # That is, they appear in more than one edge
          for e1, e2 in self.edges:
              if e1 not in seen:
                  seen.add(e1)
              else:
                  self.branches.add(e1)
  
              if e2 not in seen:
                  seen.add(e2)
              else:
                  self.branches.add(e2)
  
          # The nodes that are not branches are leaves
          self.leaves = set(self.nodes.keys()) - self.branches
          self.leaves.remove(self.root)
docs: This function assumes the self.__tree object has been setup,
              though it doesn't care how. It will then setup all python
              side data structures to be used for querying this object.