打印二进制树到文件

时间:2016-03-26 22:50:34

标签: java save binary-tree

我有一个应该将二叉树打印到文件的方法。就是这样:

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;
}
}

4 个答案:

答案 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方法错误。

你有一个单一值的循环而没有任何下一个,所以它永远不会结束。

它还递归调用自身,尝试在递归调用中再次打开文件。那会失败。

您必须将方法拆分为两个:

  • 第一种方法打开文件,调用第二种方法,然后关闭文件(请使用try-with-resources!)。
  • 第二种方法做三行call-self(左),写节点,call-self(右)。

答案 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];
       }
    }
}