我正在尝试从相应的字符串文件加载二叉树。我很早就在代码中得到了NoSuchElementException错误(确切的行被注释),我不确定该算法是否可以开始工作。文本文件的排序如下:
hello 0 0
my 0 0
name 1 1
其中第一个数字表示节点是否有左子节点,第二个数字表示节点是否有正确的子节点。
我的BinaryTree类有两个子类,ConsTree和EmptyTree,每个树都有自己的左右子树。
以下是该方法的代码:
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();
}
以下是我的ConsTree类的构造函数。这是我制作方法时唯一的其他代码。
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;
}
EmptyTree类的构造函数完全空白。
以下是我用来测试方法的内容:
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]包含在问题开头列出内容的文本文件的名称。
如果有人能让我朝着正确的方向前进,那将会有所帮助。
如果您需要任何其他信息,请告诉我们。
答案 0 :(得分:0)
关于读取数据元素的代码和if
条件似乎没问题。 此行未出现错误 if(rightChild == 1)
。请仔细查看,它必须来自此行tree.right = stack.pop();
或包含您的堆栈操作的其他行。
我怀疑它来自tree.right
因为没有这样的元素。如果您可以共享其余的代码,那么找到确切的问题会很有帮助。