code: def iter_trees(nexson, nexson_version=None):
      
      if nexson_version is None:
          nexson_version = detect_nexson_version(nexson)
      nex = get_nexml_el(nexson)
      if _is_by_id_hbf(nexson_version):
          trees_group_by_id = nex['treesById']
          group_order = nex.get('^ot:treesElementOrder', [])
          if len(group_order) < len(trees_group_by_id):
              group_order = list(trees_group_by_id.keys())
              group_order.sort()
          for trees_group_id in group_order:
              trees_group = trees_group_by_id[trees_group_id]
              tree_by_id = trees_group['treeById']
              ti_order = trees_group.get('^ot:treeElementOrder', [])
              if len(ti_order) < len(tree_by_id):
                  ti_order = list(tree_by_id.keys())
                  ti_order.sort()
              for tree_id in ti_order:
                  tree = tree_by_id[tree_id]
                  yield trees_group_id, tree_id, tree
      else:
          for trees_group in nex.get('trees', []):
              trees_group_id = trees_group['@id']
              for tree in trees_group.get('tree', []):
                  tree_id = tree['@id']
                  yield trees_group_id, tree_id, tree
docs: generator over all trees in all trees elements.
      yields a tuple of 3 items:
          trees element ID,
          tree ID,
          the tree obj