Как вывести дерево двоичного поиска (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 шт):

Автор решения: default locale

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. Код не компилировал, если возникнут ошибки придется немного поправить.

→ Ссылка