Как вывести дерево двоичного поиска (Binary Search Tree) в виде String
Здраствуйте. Есть рабочий код который когда вызываю метод print() возвращает Binary Search Tree в виде диаграммы с символами и цифрами как надо мне. Проблема в том что мне надо возвратить не просто символы и цифры а чтоб они все были в одном String который будет возвращен. И непонятно как это сделать.
@Override
public String prettyPrint() {
return null; //Тут я должен возвратить дерево в виде String
}
public void print() {
print("", "", "", "");
}
public void print(String prefix, String left, String mid, String right) {
String indent = " ".repeat(String.valueOf(data).length());
if (leftChild != null) {
leftChild.print(prefix + left + indent, " ", "┌", "│");
}
System.out.println(prefix + mid + data
+ " ┐┘┤".charAt((leftChild != null ? 2 : 0)
+ (rightChild != null ? 1 : 0)));
if (rightChild != null) {
rightChild.print(prefix + right + indent, "│", "└", " ");
}
}
Ответы (1 шт):
System.out имеет тип PrintStream, так что мы можем написать более общий метод, передавая в него PrintStream:
public void print() {
print(System.out, "", "", "", "");
}
public void print(PrintStream stream, String prefix, String left, String mid, String right) {
String indent = " ".repeat(String.valueOf(data).length());
if (leftChild != null) {
leftChild.print(stream, prefix + left + indent, " ", "┌", "│");
}
stream.println(prefix + mid + data
+ " ┐┘┤".charAt((leftChild != null ? 2 : 0)
+ (rightChild != null ? 1 : 0)));
if (rightChild != null) {
rightChild.print(stream, prefix + right + indent, "│", "└", " ");
}
}
После этого можно подставить свой поток и преобразовать его в строку:
public String prettyPrint() {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final String utf8 = StandardCharsets.UTF_8.name();
try (PrintStream ps = new PrintStream(baos, true, utf8)) {
print(ps, "", "", "", "");
}
return baos.toString(utf8);
}
Ну это вариант с наименьшими изменениями.
Второй вариант это использовать StringBuilder. Аналогичным образом передавать его в метод и вызывать append добавляя переносы строки:
@Override
public String prettyPrint() {
StringBuilder builder = new StringBuilder();
prettyPrint(builder, "", "", "", "");
return builder.toString();
}
private void prettyPrint(StringBuilder result, String prefix, String left, String mid, String right) {
String indent = " ".repeat(String.valueOf(data).length());
if (leftChild != null) {
leftChild.prettyPrint(result, prefix + left + indent, " ", "┌", "│");
}
result.append(prefix + mid + data
+ " ┐┘┤".charAt((leftChild != null ? 2 : 0)
+ (rightChild != null ? 1 : 0)));
result.append("\n");
if (rightChild != null) {
rightChild.prettyPrint(result, prefix + right + indent, "│", "└", " ");
}
}
После этого можно print переписать так чтобы использовался prettyPrint.
P.S. Код не компилировал, если возникнут ошибки придется немного поправить.