3

我正在尝试从相应的字符串文件中加载二叉树。我很早就在代码中收到了 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] 包含文本文件的名称,该文件的内容列在问题的开头。

如果有人能把我引向正确的方向,那将很有帮助。

如果您需要任何其他信息,请告诉我。

4

1 回答 1

0

您在读取数据元素和if条件方面的代码似乎很好。这条线没有出现错误 if(rightChild == 1)。请仔细看,它必须来自该行tree.right = stack.pop();或包含您的堆栈操作的其他行。

我怀疑它的来源tree.right,因为没有这样的元素。如果您可以共享其余代码,这将有助于找到确切的问题。

于 2012-10-13T04:57:04.637 回答