Вывод обхода BST в файл

1

Я сделал программу, которая делает вещи с двоичным деревом сераша, и у меня есть метод, который печатает обход после него.

public static void postOrderTrav(TreeNode node){
    if(node != null){
        postOrderTrav(node.getLeft());
        postOrderTrav(node.getRight());
        System.out.print(node.getVal() + " ");
    }
}

Тем не менее, я также хочу напечатать обход после заказа в файл. Как это сделать, в этом методе, который использует рекурсию? Я попытался поставить вызов метода writeToFile в разных местах, но они всегда выписывают только одно число...

Теги:
file

2 ответа

0
Лучший ответ

Если в методе writeToFile вы writeToFile что вы всегда открываете, записываете и закрываете один и тот же файл, вы в основном говорите ему, чтобы он перезаписывал все каждый раз, когда вы печатаете, в результате файл, содержащий только одно значение, когда программа завершается.

Вы можете преодолеть это, открыв файл в режиме добавления, если вы настаиваете на том, чтобы использовать вашу функцию таким образом, открыв файл следующим образом (обратите внимание на истинный аргумент):

FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);

Однако открытие и закрытие файла для каждой записи действительно неэффективно, поэтому лучший способ сделать это:

Предполагая, что вы вызываете свой метод из основного, вы можете сделать что-то подобное, если вы печатаете по одному элементу за раз:

private static BufferedWriter bw;

public static void main(String[] args) {

    File file = new File("/your/file/path/<filename>");

    // if file doesnt exists, then create it
    if (!file.exists()) {
        file.createNewFile();
    }

    FileWriter fw = new FileWriter(file.getAbsoluteFile());
    BufferedWriter bw = new BufferedWriter(fw);

    postOrderTrav(node);

    bw.close();
}

и в вашем методе у вас будет:

public static void postOrderTrav(TreeNode node){
    if(node != null){
        postOrderTrav(node.getLeft());
        postOrderTrav(node.getRight());
        System.out.print(node.getVal() + " ");
        bw.write(node.getVal() + " ");
    }
}

Посмотрите здесь информацию о печати в файл. Вы можете печатать непосредственно в файл при печати на выходе или сохранить результат в структуре данных (или String) и распечатать его в конце.

0

Лучше использовать Apache для таких простых задач, чтобы минимизировать количество строк и просто пройти класс StrinBuilder.

import org.apache.commons.io.FileUtils

public static printPostOrderTravInFiles(TreeNode node, String fileName) throws IOException{
  StringBuffer sb = new StringBuffer();
  postOrderTrav(node, sb);
  FileUtils.writeStringToFile(sb.toString());
}


public static void postOrderTrav(TreeNode node, StringBuffer sb){
    if(node != null){
        postOrderTrav(node.getLeft());
        postOrderTrav(node.getRight());
        sb.append(node.getVal() + " \n");
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню