我有一个应该将二叉树打印到文件的方法。就是这样:
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;
}
}
答案 0 :(得分: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();
}
答案 1 :(得分:1)
整个writeFile
方法错误。
你有一个单一值的循环而没有任何下一个,所以它永远不会结束。
它还递归调用自身,尝试在递归调用中再次打开文件。那会失败。
您必须将方法拆分为两个:
答案 2 :(得分:0)
这是适用于任何想要了解的人的解决方案。
ended
答案 3 :(得分:0)
我使用数组存储节点的数据(左-节点-右) 在此之前,我将数组的数据写入所需的文件。
void LNR(TREE t, int a[], int &i){
if(t != NULL)
{
LNR(t ->pLeft, a, i);
a[i] = t ->data;
i++;
LNR(t ->pRight, a, i);
}
}
void Output(const char *outfile, TREE t){
int a[100];
int i = 0;
LNR(t, a, i);
ofstream out;
out.open(outfile);
if (!out.is_open())
{
cout << "Unble to open the file.";
}
else
{
for (int j = 0; j < i; j++)
{
if (j < i)
out << a[j] << " ";
else
out << a[j];
}
}
}