I’m attempting to load a binary tree from the corresponding string file. I get a NoSuchElementException error pretty early on in the code(the exact line is commented), and I’m not sure that the algorithm will work to begin with. The text file is ordered like this:
hello 0 0
my 0 0
name 1 1
where the first number indicates whether or not the node has a left child, and the second number indicates whether or not the node has a right child.
My BinaryTree class has two subclasses, ConsTree and EmptyTree, and each tree has its own left and right subtrees.
Here is the code for the method:
BinaryTree<String> loadFile(String filename)
{
File file = new File(filename);
Scanner scanny = new Scanner(file);
Stack<BinaryTree<String>> stack = new Stack<BinaryTree<String>>();
while(scanny.hasNextLine())
{
String data = scanny.next();
int leftChild = scanny.nextInt();
int rightChild = scanny.nextInt();
ConsTree<String> tree = new ConsTree<String>(data, null, null);
if(rightChild == 1) //this line throws a NoSuchElementException
{
tree.right = stack.pop();
}
if(leftChild == 1)
{
tree.left = stack.pop();
}
stack.push(tree);
}
return stack.pop();
}
Here are the constructors for my ConsTree class. This is the only other code I had when I made the method.
public ConsTree(T data, BinaryTree<T> left, BinaryTree<T> right)
{
this.data = data;
this.left = left;
this.right = right;
}
public ConsTree(T data)
{
this.left = new EmptyTree();
this.right = new EmptyTree();
this.data = data;
}
The constructor for the EmptyTree class is completely blank.
Here is what I’m using to test the method:
public static void main(String[] args)
{
Loader l = new Loader(); //the class with the load method in it
BinaryTree<String> t = l.loadFile(args[0]);
System.out.println(t);
}
args[0] contains the name of the text file that has the contents listed towards the beginning of the question.
If anyone could put me in the right direction, that would be helpful.
If you need any other info, please let me know.
You code with respect to reading the data elements and
ifconditions seems to be fine. Error is not coming at this lineif(rightChild == 1). Please look carefully, it must be coming from this linetree.right = stack.pop();or other line containing your stack operation.I doubt its coming from
tree.rightas there is no element like this. If you can share rest of your code, it would be helpful in finding the exact issue.