docs: def colless(self, normalize='leaves'):
          '''Compute the Colless balance index of this ``Tree``. If the tree has polytomies, they will be randomly resolved
  
          Args:
              ``normalize`` (``str``): How to normalize the Colless index (if at all)
  
              * ``None`` to not normalize
  
              * ``"leaves"`` to normalize by the number of leaves
  
              * ``"yule"`` to normalize to the Yule model
  
              * ``"pda"`` to normalize to the Proportional to Distinguishable Arrangements model
  
          Returns:
              ``float``: Colless index (either normalized or not)
          '''
          t_res = copy(self); t_res.resolve_polytomies(); leaves_below = dict(); n = 0; I = 0
          for node in t_res.traverse_postorder():
              if node.is_leaf():
                  leaves_below[node] = 1; n += 1
              else:
                  cl,cr = node.children; nl = leaves_below[cl]; nr = leaves_below[cr]
                  leaves_below[node] = nl+nr; I += abs(nl-nr)
          if normalize is None or normalize is False:
              return I
          elif not isinstance(normalize,str):
              raise TypeError("normalize must be None or a string")
          normalize = normalize.lower()
          if normalize == 'leaves':
              return (2.*I)/((n-1)*(n-2))
          elif normalize == 'yule':
              return (I - n*log(n) - n*(EULER_GAMMA-1-log(2)))/n
          elif normalize == 'pda':
              return I/(n**1.5)
          else:
              raise RuntimeError("normalize must be None, 'leaves', 'yule', or 'pda'")