Convert the tree from Heilman/Sagae 2015 format into a conventional binary tree,
        which can be easily converted into output formats like RS3.

def hs2015tree2dgparentedtree(self):
        """Convert the tree from Heilman/Sagae 2015 format into a conventional binary tree,
        which can be easily converted into output formats like RS3.
        """
        def transform(hs2015_tree):
            """Transform a HS2015 parse tree into a more conventional parse tree.

            The input tree::

                                 ROOT
                        __________|________
                satellite:contra      nucleus:span
                       st                  |
                       |                   |
                      text                text
                       |                   |
                    Although              they
                    they did            accepted
                    n't like           the offer
                      it ,                 .

                                  Contrast
                         ____________|___________
                        S                        N
                        |                        |
                  Although they            they accepted
                did n't like it ,           the offer .
            """
            if is_leaf_node(hs2015_tree):
                return hs2015_tree

            tree_type = get_tree_type(hs2015_tree)
            if tree_type in (SubtreeType.root, SubtreeType.nucleus, SubtreeType.satellite):
                child_types = get_child_types(hs2015_tree)
                rel_nuc_type = get_nuclearity_type(child_types)
                if rel_nuc_type == NucType.nucsat:
                    nuc_id = child_types['nucleus'][0]
                    sat_id = child_types['satellite'][0]
                    return get_nucsat_subtree(hs2015_tree, nuc_id, sat_id)

                elif rel_nuc_type == NucType.multinuc:
                    transformed_subtrees = [Tree('N', [transform(st)]) for st in hs2015_tree]
                    # in a multinuc, all nucs will carry the relation name
                    relname = get_capitalized_relname(hs2015_tree, 0)
                    return Tree(relname, transformed_subtrees)

                elif rel_nuc_type == NucType.multisat:
                    # In RST, multiple satellites (at least adjacent ones)
                    # can be in a relation with the same nucleus.
                    # To express this in a tree, we convert this schema to
                    # a left-branching structure, e.g. (((N S) S) S).
                    nuc_id = child_types['nucleus'][0]
                    first_sat_id in child_types['satellite'][0]

                    multisat_subtree = get_nucsat_subtree(hs2015_tree, nuc_id, first_sat_id)
                    for sat_id in child_types['satellite'][1:]:
                        sat_subtree = hs2015_tree[sat_id]
                        relname = get_capitalized_relname(hs2015_tree, sat_id)
                        multisat_subtree = Tree(relname, [
                            Tree('N', [multisat_subtree]),
                            Tree('S', [transform(sat_subtree)])
                        ])
                    return multisat_subtree

                elif rel_nuc_type == NucType.edu:
                    # return the EDU text string
                    return hs2015_tree[0][0]

                else:
                    raise ValueError("Unknown nuclearity type: {}".format(rel_nuc_type))

            else:
                assert tree_type == SubtreeType.text

        def get_nucsat_subtree(tree, nuc_id, sat_id):
            nuc_subtree = tree[nuc_id]
            sat_subtree = tree[sat_id]
            relname = get_capitalized_relname(tree, sat_id)

            # determine order of subtrees
            if nuc_id < sat_id:
                return Tree(relname, [
                    Tree('N', [transform(nuc_subtree)]),
                    Tree('S', [transform(sat_subtree)])
                ])
            else:
                return Tree(relname, [
                    Tree('S', [transform(sat_subtree)]),
                    Tree('N', [transform(nuc_subtree)])
                ])

        tree = transform(self.hs2015file_tree)
        return DGParentedTree.convert(tree)