code: def newickTreeParser(newickTree, defaultDistance=DEFAULT_DISTANCE, \
                       sortNonBinaryNodes=False, reportUnaryNodes=False):
      newickTree = newickTree.replace("(", " ( ")
      newickTree = newickTree.replace(")", " ) ")
      newickTree = newickTree.replace(":", " : ")
      newickTree = newickTree.replace(";", "")
      newickTree = newickTree.replace(",", " , ")
      newickTree = re.compile("[\s]*").split(newickTree)
      while "" in newickTree:
          newickTree.remove("")
      def fn(newickTree, i):
          if i[0] < len(newickTree):
              if newickTree[i[0]] == ':':
                  d = float(newickTree[i[0]+1])
                  i[0] += 2
                  return d
          return defaultDistance
      def fn2(newickTree, i):
          if i[0] < len(newickTree):
              j = newickTree[i[0]]
              if j != ':' and j != ')' and j != ',':
                  i[0] += 1
                  return j
          return None
      def fn3(newickTree, i):
          if newickTree[i[0]] == '(':
              subTreeList = []
              i[0] += 1
              k = []
              while newickTree[i[0]] != ')':
                  if newickTree[i[0]] == ',':
                      i[0] += 1
                  subTreeList.append(fn3(newickTree, i))
              i[0] += 1
              def cmp(i, j):
                  if i.distance < j.distance:
                      return -1
                  if i.distance > j.distance:
                      return 1
                  return 0
              if sortNonBinaryNodes:
                  subTreeList.sort(cmp)
              subTree1 = subTreeList[0]
              if len(subTreeList) > 1:
                  for subTree2 in subTreeList[1:]:
                      subTree1 = BinaryTree(0.0, True, subTree1, subTree2, None)
                  subTree1.iD = fn2(newickTree, i)
                  subTree1.distance += fn(newickTree, i)
              elif reportUnaryNodes:
                  subTree1 = BinaryTree(0.0, True, subTree1, None, None)
                  subTree1.iD = fn2(newickTree, i)
                  subTree1.distance += fn(newickTree, i)
              else:
                  fn2(newickTree, i)
                  subTree1.distance += fn(newickTree, i)
              return subTree1
          leafID = fn2(newickTree, i)
          return BinaryTree(fn(newickTree, i), False, None, None, leafID)
      return fn3(newickTree, [0])