Медленная конкатенация строк на большом входе

Я написал ADT с n-арным деревом, который работает нормально. Однако мне нужно хранить его сериализацию в переменной вызывающего класса. например.

    DomTree<String> a = Data.createTreeInstance("very_large_file.xml");
    String x = a.toString();

Я написал метод, который служит цели именно так, как мне нужно, но на очень больших входах это занимает вечность (20 минут на файле XML объемом 100 МБ) - я рассчитал методы и построил дерево из файла XML быстро, но вызов toString (), как показано выше, очень медленно.

@Override
public String toString(){
    return printTree(this);
}

public String printTree(AbstractTree<E> tree){
    if (tree.isLeaf()){
        return tree.getNodeName();
    }else{
        String tStr = tree.getNodeName() + "(";

        int i = 0;
        Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
        while (i < tree.getChildren().size() - 1){

            tStr += printTree(child.next()) + ", ";
            i++;
        }
        tStr += printTree(child.next()) + ")";

        return tStr;    
    }
}

Я предполагаю, что это связано со способом построения строки, а не с тем, как обходится дерево? Есть лучший способ сделать это?

ОБНОВЛЕНИЕ: Следуя примеру Skaffman, следующий код выдаетOfMemoryError для очень большого ввода.

@Override
public String toString(){
    StringBuilder buffer = new StringBuilder();
    printTree(this, buffer);
    return buffer.toString();

}

public String printTree(AbstractTree<E> tree, StringBuilder buffer){
    if (tree.isLeaf()){
        return tree.getNodeName();
    }else{
        buffer.append(tree.getNodeName());
        buffer.append("(");

        int i = 0;
        Iterator<AbstractTree<E>> child = tree.getChildren().iterator();
        while (i < tree.getChildren().size() - 1){

            buffer.append(printTree(child.next(), buffer));
            buffer.append(", ");
            i++;
        }
        buffer.append(printTree(child.next(), buffer)); 
        buffer.append(")");

        return buffer.toString();   
    }
}

ОБНОВЛЕНИЕ: теперь работает отлично, на примере Skaffmans

Ответы на вопрос(6)

Ваш ответ на вопрос