Если вы хотите сделать это с конкатенацией строк, ваш второй пример почти работает - проблема только в том, что вы отбрасываете результаты рекурсивных вызовов.
/**
* creates an Inorder-string-view of this tree and appends it to the given string.
* @return the new String.
*/
public String inOrder(String string) {
if (left != null)
string = left.inOrder(string);
string += content;
if (right != null)
string = right.inOrder(string);
return string;
}
Но это так (для большегодеревья) ужасно неэффективно, поскольку каждый +=
фактически создает новую строку, копируя символы string
и content
- таким образом, каждая строка содержимого фактически копируется the number of later nodes
(в порядке следования) раз (+1),Немного лучше было бы так:
public String inOrder() {
String leftS; String rightS;
if (left != null)
leftS = left.inOrder();
else
leftS = "";
if (right != null)
rightS = right.inOrder();
else
rightS = "";
return leftS + content + rightS;
}
или немного короче:
public String inOrder {
return
(left != null ? left.inOrder() : "") +
content +
(right != null ? right.inOrder() : "");
}
Теперь каждая строка содержимого копируется только на количество узлов над ней времена (+1), что для «обычного» (не очень несбалансированного) дерева намного меньше.(Этот вариант также можно легко распараллелить.)
Но на самом деле версия StringBuilder обычно является предпочтительной, поскольку она копирует каждую строку содержимого только один раз (при добавлении ее вStringBuilder) и, возможно, еще несколько раз при внутреннем изменении размера StringBuilder (поэтому, если вы можете оценить окончательный размер до фактического преобразования, создайте достаточно большой StringBuilder).