import io
import BinaryTree
type File = {
write(_:String)->Void
read->String
close->Void
next->String}
type BinaryStringTree = {
setLeft(_:BinaryStringTree)->Void
setRight(_:BinaryStringTree)->Void
clear->Void
isEmpty->Boolean
isLeaf->Boolean
isLeftChild->Boolean
isRightChild->Boolean
isRoot->Boolean
height->Number
depth->Number
getString->String
getLeftChild->BinaryStringTree
getRightChild->BinaryStringTree
getParent->BinaryStringTree
getRoot->BinaryStringTree
setParent(_:BinaryStringTree)->Void
==(_:BinaryStringTree)->Boolean}
def empty:BinaryStringTree is public, readable = BinaryTree.new
//=================================================
// Helper method for writeTree, writes the binary tree to file in
// pre-order traversal
// @pre out refers to a legitimate file, root exists
// @post writes tree to file
// @param out is the file for the animal tree
// @param root is the root of the animal tree
method toFileHelper(out:File, root:BinaryStringTree)->Void is confidential{
if(root.isLeaf) then {out.write("A{root.getString}\n")}
else{
out.write("Q{root.getString}\n")
toFileHelper(out, root.getLeftChild)
toFileHelper(out, root.getRightChild)}
}
// Helper method for readTree, reads through file and creates binary tree
// based on questions and answers
// @pre in is a legitimate file
// @post returns tree constructed from file
// @param in is the input file for the animal tree
method readFileHelper(in:File)->BinaryStringTree is confidential{
var line:String := ""
var nxt := in.next
while{nxt != "\n"} do {
line := line ++ nxt
nxt := in.next}
if(line.size > 0) then {
if(line.at(1) == "Q") then{
return BinaryTree.withValue(line.substringFrom(2)to(line.size))
left(readFileHelper(in))right(readFileHelper(in))}
else{if(line.at(1) == "A") then{
return BinaryTree.withValue(line.substringFrom(2)to(line.size))}
}
}
BinaryTree.new}
// opens output file and calls recursive emthod to write to it
// @pre filename refers to a legitimate file, root exists
// @post writes file containing questions and answers for tree
// @param filename is the name of the file to write to
// @param root is the root of the animal tree
method writeTree(filename:String, root:BinaryStringTree)->Void is public{
var outfile := io.open(filename, "w+")
toFileHelper(outfile, root)
outfile.close}
// opens input file and calls recursive method to read and create tree
// @pre filename refers to legitimate file
// @post returns tree created from file
// @param filename is the name of the file to read from
method readTree(filename:String)->BinaryStringTree is public{
var infile := io.open(filename, "r")
readFileHelper(infile)}