从文件中读回BST

时间:2014-04-12 18:08:26

标签: java serialization

这是一个令人困惑的问题所以我道歉,因为我不太确定如何用它来表达。基本上我正在做的是使用排序二进制搜索树。在整个程序中,用户向树添加记录,该树是包含(int studentNumber, String firstName, String lastName, String major, double gpa)的节点。在程序结束时,节点被转换为带有我自定义Node类的LinkedList,然后该列表被序列化为文件。

现在,在启动时,我想基本上将该文件读回另一个列表,显示列表,然后将其添加回BST,以便以各种方式对其进行排序。我的问题在于读取文件中的每一行(节点)并将字段(int studentNumber, String firstName, String lastName, String major, double gpa)从每个节点"拉回到树中。这是我在阅读部分到目前为止所做的:

public void loadRecord(LinkedList list) {

    File file = new File("records.txt"); 

    try
    {

        LinkedList<Node> list2;
        ObjectInputStream input = new ObjectInputStream(new FileInputStream(file));
        list2 = (LinkedList<Node>)input.readObject();
        if (list2.size() > 0){
            list.addAll(list2);
        }//end if
        else {
            System.out.println("No elements");
        }

    }
    //Catch Exceptions
   //display list
}//end loadRecord

再次......如果这根本没有意义,我道歉。我很有可能走向完全错误的方向,所以我很感激任何反馈。请让我知道你的想法!

1 个答案:

答案 0 :(得分:0)

首先,a  链表和二叉搜索树是两个不同的数据结构。你不能与他人合作。 假设您有一个要存储的数字列表。数据以相同的顺序添加到两个结构中。链表如下所示:

|5|-->|3|-->|7|-->|2|-->|6|-->|4|-->|8|-->|1|
  • “| X |”表示一个节点,其中包含存储在其中的数据。
  • 箭头表示节点到下一个节点的引用。
  • 数据的订购方式与输入的方式相同。

二叉搜索树:

                         5 
                        / \
                       /   \
                      3     7
                     / \   / \
                    2   4 6   8
                   /            
                  1 
  • 对于每个父节点,都有左节点和右节点的引用。左子节点中的数据小于父节点中的数据,右子节点上的数据大于父节点上的数据。

因此,无论输入什么数据,在一个值可以大于或小于另一个值的意义上,它必须是“可比较的”。因此,如果您存储的数据是学生,那么一个学生的价值必须高于另一个学生(更高的gpa,更大的学生数,最后按字母顺序排列等等)。

与链表不同,标准API不提供二进制搜索树类。所以你已经实现了自己的。您需要熟悉递归以实现BST。确保您决定如何比较学生并相应地实施树。这是一个可以提供帮助的链接:Binary Search Tree and Tree Traversal

接下来,您需要从记录文件中提取学生信息并将其存储在树中。如果您说明了如何在record.txt文件中订购学生信息,这将有所帮助。现在,我将假设它被订购,以便每个学生的数据写在一行。我将在自定义节点(应该称为student)类中实现一个方法,该类接受一行,解析它,并将数据存储在学生的字段中。 然后我会创建一个创建新学生的while循环,将当前行添加到student对象的相应方法中,并且只要输入流中有下一行,就将student对象添加到树中。

正如我所说,我需要更多关于记录文件的信息才能进一步解释。如果您需要进一步澄清,请告诉我。