Я сделал программу, которая делает вещи с двоичным деревом сераша, и у меня есть метод, который печатает обход после него.
public static void postOrderTrav(TreeNode node){
if(node != null){
postOrderTrav(node.getLeft());
postOrderTrav(node.getRight());
System.out.print(node.getVal() + " ");
}
}
Тем не менее, я также хочу напечатать обход после заказа в файл. Как это сделать, в этом методе, который использует рекурсию? Я попытался поставить вызов метода writeToFile в разных местах, но они всегда выписывают только одно число...
Если в методе 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) и распечатать его в конце.
Лучше использовать 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");
}
}