2016-03-26 3 views
0

У меня есть метод, который должен печатать двоичное дерево в файл. Это он:печать двоичного дерева в файл

public void writeFile(Node mainNode) 
{ 
    FileOutputStream outputStream = null; 
    PrintWriter printWriter = null; 

    try 
    { 

     outputStream = new FileOutputStream("BinaryTree.txt"); 
     printWriter = new PrintWriter(outputStream); 


     while(mainNode != null) 
     { 
      writeFile(mainNode.leftChild); 
      printWriter.print(mainNode); 
      writeFile(mainNode.rightChild); 

     } 

     printWriter.close(); 

    }catch(IOException e) 
    { 
    System.out.println("An error occured"); 
     printWriter.close(); 
    } 

} 

Проблема заключается в том, что она, кажется, вечно цикл, как это не находя конец дерева. Я могу попробовать.

Вот и класс Node.

class Node 
{ 
int id; 
int grade; 
String name; 

Node leftChild; 
Node rightChild; 


Node(int id, int grade, String name) 
{ 
    this.id = id; 
    this.grade = grade; 
    this.name = name; 
} 


public String toString() 
{ 
    return name + " has a grade of " + grade + " and their ID is " + id; 
} 
} 

ответ

1

Как вы ожидаете этот цикл до конца:

while(mainNode != null) { 
    // never change mainNode 
} 

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

public void writeFile(Node mainNode, PrintWriter w) 
{ 
    if (mainNode == null) // base case to stop recursion 
     return; 
    top_call = false; // Flag needed later 
    if (w == null) { 
     outputStream = new FileOutputStream("BinaryTree.txt"); 
     w = new PrintWriter(outputStream); 
     top_call = true; // mark highest entry point to know when to close writer 
    } 
    writeFile(mainNode.leftChild, w); 
    w.print(mainNode); 
    writeFile(mainNode.rightChild, w); 

    if (top_call) // don't close writer in recursive calls 
     w.close(); 
} 
+0

Точно. Однако, возможно, вы захотите разработать немного больше. Я этого раньше не видел! Хорошая мысль. – HyperNeutrino

+0

Ну, когда mainNode возвращает null, тогда он должен вырваться. Не так ли? – Allan

+0

@Allan Ну, mainNode не является нулевым, когда вы вводите цикл, и он никогда не изменяется. Рекурсивные вызовы внутри повторяются снова и снова, хотя где-то в этих рекурсивных вызовах может быть нулевой mainNode – schwobaseggl

1

Всего writeFile метод является неправильным.

У вас есть цикл над одним значением без какого-либо перехода к следующему, так что он никогда не кончится.

Он также называет себя рекурсивно, пытаясь снова открыть файл внутри рекурсивного вызова. Это провалится.

Вы должны разделить метод надвое:

  • Первый способ открыть файл, вызывает второй метод, а затем закрывает файл (с использованием примерочных с-ресурсами, пожалуйста!).
  • Второй метод выполняет три линии вызова-себя (слева), узел записи, call-self (справа).
0

Вот решение, которое работало для тех, кто хотел бы знать.

public void writeFile(Node mainNode) 
{ 
    FileOutputStream outputStream = null; 
    PrintWriter printWriter = null; 

    try 
    { 

     outputStream = new FileOutputStream("BinaryTree.txt"); 
     printWriter = new PrintWriter(outputStream); 

     write(mainNode, printWriter); 

     printWriter.flush(); 

    }catch(IOException e) 
    { 
    System.out.println("An error occured"); 
     printWriter.close(); 
    } 

} 

public void write(Node mainNode, PrintWriter w) 
{ 
    if(mainNode != null){ 
     write(mainNode.leftChild, w); 
     w.print(mainNode); 
     write(mainNode.rightChild, w); 
    } 
} 
Смежные вопросы