Java - 从文本文件加载二叉树

时间:2012-10-13 04:08:09

标签: java tree stack

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

如果有人能让我朝着正确的方向前进,那将会有所帮助。

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

1 个答案:

答案 0 :(得分:0)

关于读取数据元素的代码和if条件似乎没问题。 此行未出现错误 if(rightChild == 1)。请仔细查看,它必须来自此行tree.right = stack.pop();或包含您的堆栈操作的其他行。

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