2016-03-26 9 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はnullではなく、変更されません。これらの再帰呼び出しのどこかでmainNodeがnullの可能性がありますが、内部の再帰呼び出しは何度も何度も繰り返されます。 – schwobaseggl

1

writeFileメソッド全体が間違っています。

あなたは次のものを使わずに単一の値をループしているので、決して終了しません。

また、再帰呼び出しの中でファイルを再度開こうとすると、再帰的に呼び出します。それは失敗するだろう。次の2つの方法を分割する必要があり

  • 第一の方法は、ファイルを開いて、第二の方法を呼び出し、その後、(、のtry-と、リソースを使用してください!)ファイルを閉じます。
  • 第2の方法は、call-self(左)、writeノード、call-self(右)の3行を行います。
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); 
    } 
} 
関連する問題