我正在从文件中读取字符串并记录了'〜'每当节点的子节点为空时。然后,我将这些字符串添加到二叉树中。但我的代码只是将所有字符串(包括'〜')添加到左侧树节点中。
如何让算法在“'〜'到达并插入一个正确的节点(除非当然下一个字符串也是'〜')?
这是我的代码:
// Reads the elements in the tree in pre-order
public void fromFile()
{
BufferedReader in;
String s = null;
try {
in = new BufferedReader(new FileReader("animal_game.txt"));
StringBuffer stringBuffer = new StringBuffer();
while( (s=in.readLine()) != null )
{
stringBuffer.append(s);
stringBuffer.append("\n");
}
fromFile(stringBuffer.toString());
in.close();
}
catch (IOException ex)
{
Logger.getLogger(Tree.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void fromFile(String s)
{
if (root == null)
{
root = new Node<>((T)s);
size++;
}
else
{
fromFile(root, s);
}
}
// helper function
private void fromFile( Node<T> node, String s)
{
// if null tree node reached,
if(s==NULL_TREE_NODE)
{
fromFile(node, s);
}
// insert left node
if (node.no == null)
{
node.no = new Node<>((T)s);
}
else
{
fromFile(node.no, s);
}
// insert right node
if (node.yes == null)
{
node.yes = new Node<>((T)s);
}
else{
fromFile(node.yes, s);
}
}
这是我将树保存到文件的代码:
// Writes the elements in the tree in pre-order
public void toFile()
{
// Writes in preorder starting with the root node
if (root != null)
{
BufferedWriter out;
try {
out = new BufferedWriter(new FileWriter("animal_game.txt"));
toFile(out, root);
out.close();
}
catch (IOException ex)
{
Logger.getLogger(Tree.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
// Helper function
private void toFile(BufferedWriter out, Node<T> node)
{
try {
if (node == null) {
out.write(NULL_TREE_NODE); // null
out.newLine();
return;
}
//assert !node.data.equals(NULL_TREE_NODE); // Reserver for us..
out.write((String)node.data); // these nodes hold Strings
out.newLine();
toFile(out, node.no);
toFile(out, node.yes);
}
catch (IOException ex)
{
Logger.getLogger(Tree.class.getName()).log(Level.SEVERE, null, ex);
}
}
这是我的档案
是哺乳动物吗?
它是爬行动物吗?
是鱼吗?
鹈鹕
〜
〜
鲨
〜
〜
它灭绝了吗?
龟
〜
〜
迅猛
〜
〜
它有毛皮吗?
象
〜
〜
猫
答案 0 :(得分:0)
您应该更改fromFile()以匹配您的toFile():取代接受Node和表示整个文件的String,取一个BufferedReader,允许它轻松读取各行。此外,更改帮助程序构建函数以返回节点,以便在〜节点的情况下它可以返回null。 然后,可以递归地构建整个树,当到达节点时返回null返回树:
private Node<T> fromFile(BufferedReader s) throws IOException
{
String line = s.readLine();
if(line == null) throw new IllegalArgumentException("File does not specify complete tree");
// if null tree node reached,
if(line.equals(NULL_TREE_NODE)) return null;
Node<T> node = new Node<>();
node.data = line;
node.no = fromFile(s);
node.yes = fromFile(s);
return node;
}
然后,稍微调整你的fromFile():
public void fromFile()
{
try(BufferedReader in = new BufferedReader(new FileReader("animal_game.txt")))
{
root = fromFile(in);
}
catch (IOException ex)
{
Logger.getLogger(Tree.class.getName()).log(Level.SEVERE, null, ex);
}
}
我还修改了它以使用try-with-resources语句以方便,并保证在异常时正确释放资源。见http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
希望这有帮助。