在二叉树中为节点输入值

时间:2018-01-28 02:27:35

标签: java tree binary-tree

虽然这个问题对其他人来说似乎不是问题,但我坚持认为,我无法解决。互联网上似乎没有类似的东西。我需要在常规二叉树中为节点添加值。我输入树中的节点数,然后输入根(零)的序数和根中的值,最后,我输入节点(子)的序数,子的值,如果是左或右孩子的信息,以及父母的序数。最后,打印二叉树。有两个类,一个用于节点,一个用于树(数据成员是root)。代码编译,当我输入节点数时,程序抛出异常 - java.lang.NumberFormatException: For input string: ""。我被困在这里。这是代码,感谢先进的帮助。

import java.util.Scanner;

public class BinaryTreeGeneral {
    public static void main( String[] args ) {
        Scanner in = new Scanner( System.in );

        int N = in.nextInt();
        BNode<String> nodes[] = new BNode[N];
        BTree<String> tree = new BTree<>();

        String[] input = in.nextLine().split(" ");
        nodes[Integer.parseInt(input[0])] = new BNode<String>(input[1]);
        tree.root = nodes[Integer.parseInt(input[0])];

        for (int i = 1; i < N; i++) {
            input = in.nextLine().split(" ");
            nodes[Integer.parseInt(input[0])] = new BNode<String>(input[1]);
            if (input[2].equals("LEFT")) 
                tree.addNode(nodes[Integer.parseInt(input[3])], BNode.LEFT, nodes[Integer.parseInt(input[0])]);
            else
                tree.addNode(nodes[Integer.parseInt(input[3])], BNode.RIGHT, nodes[Integer.parseInt(input[0])]);
        }

        tree.printTreeInorder();
    }
}

/*Sample Input:
  10
  0 10
  1 19 LEFT 0
  2 8 LEFT 1
  3 7 LEFT 2
  4 60 RIGHT 2
  5 5 RIGHT 1
  6 4 RIGHT 0
  7 13 RIGHT 6
  8 2 LEFT 7
  9 1 RIGHT 7*/

另外,我想问一下这是一种向树的节点添加值的标准方法,还是在实际情况下有更实用,更有利的方法,而不是教科书示例?

1 个答案:

答案 0 :(得分:0)

问题是你在混淆nextIntnextLine而没有完全理解他们做了什么。

  • nextInt方法提取下一个标记并将其解析为整数。
  • nextLine会读取(并包括)下一行结束标记,并在删除行尾时将其返回。

所以...如果你打电话给nextIntnextLine为一个由一个数字组成的行,那么nextLine()调用将返回一个空字符串。 (如果你不明白我在说什么,请仔细阅读这两种方法的javadocs。)

解决方案包括:

  1. nextLine()之后添加nextInt()电话,以消费其余部分。
  2. 停止使用nextLine()split(...),只需使用nextInt()next()来电。
  3. 也可以使用nextLine().split(...)作为第一行。