图论,尝试计算树中节点时的空指针

Graph Theory, null pointer when trying to count nodes in tree

public class BuildTree {

    private HashMap<Integer, LinkedList<Integer>> tree;
    private int edges;

    public static void main(String[] args) {
        BuildTree bt = new BuildTree();
        bt.run();
    }

    private void run() {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int treeRoot = 0;
        tree = new HashMap<>();
        edges = 0;
        for (int i = 0; i < m; i++) {
            int adjacent = in.nextInt();
            int root = in.nextInt();
            if (i == 0) {
                treeRoot = root;
            }
            if (!tree.containsKey(root)) {
                tree.put(root, new LinkedList<>());
                tree.get(root).add(adjacent);
            } else {
                tree.get(root).add(adjacent);
            }
        }

//        tree is built correctly
//        tree.get(1).forEach(System.out::print);
//        System.out.println();
//        tree.get(2).forEach(System.out::print);
//        System.out.println();
//        tree.get(3).forEach(System.out::print);
//        System.out.println();
//        tree.get(6).forEach(System.out::print);
//        System.out.println();
//        tree.get(8).forEach(System.out::print);

        System.out.println(treeSize(2)); //expecting 3
    }

    private int treeSize(Integer i) {
        int size = 1;
        if (tree.get(i).isEmpty() || tree.get(i) == null) { //throws null pointer exception
            return size;
        } else {
            Iterator<Integer> it = tree.get(i).iterator();
            while (it.hasNext()) {
                Integer subRoot = it.next();
                size += treeSize(subRoot); //issue flagged here by console, directs to problematic if statement above
            }
        }
        return size;
    }
}

控制台输入如下:
10 9
2 1
3 1
4 3
5 2
6 1
7 2
8 6
9 8
10 8

我已经通过打印每个节点的相邻整数的 LinkedList 来检查树是否正确构建。我参考某个根节点计算树大小的方法不断抛出空指针异常。我是图论方面的新手,我不确定如何进行。

我找到问题了。这是我的一个简单错误。我需要从 if 语句中删除 tree.get(i).isEmpty() 。抱歉给您带来麻烦。

你的回答是对的,但问题还有另一种解决方法

if (tree.get(i).isEmpty() || tree.get(i) == null)

抛出 NullPointerException,但条件顺序错误,如果您这样做:

if (tree.get(i) == null || tree.get(i).isEmpty())

不会有NullPointerException
为什么:因为条件是从左到右检查的,当tree.get(1) == null时,则为真,所以会是:

if (true || tree.get(i).isEmpty())

编译器没有解决第二部分,因为它必须为真:

true || something || something_else = true