You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树层序遍历遇问题:Queue泛型报错、PriorityQueue抛空指针

问题1:"类型Queue不接受参数"错误

这个错误的核心原因是你导入的Queue不是泛型版本,或者JDK版本过低(泛型从JDK 5开始支持)。

解决步骤:

  • 确保代码顶部导入的是java.util.Queue,而非自定义的非泛型Queue类;
  • 确认JDK版本在5及以上(当前主流版本均满足);
  • 你写的Queue<Integer> q = new ArrayDeque<>();是标准泛型写法,只要导入正确就不会报错。
问题2:PriorityQueue替换Queue时抛出NullPointerException

你的层序遍历逻辑用null作为每层的分隔符,但PriorityQueue的底层实现不允许存储null元素——当执行q.add(null)时会直接抛出NullPointerException,这是PriorityQueue的设计特性(排序逻辑无法处理null的比较)。而ArrayDeque支持存储null,所以之前用它没问题。

修正层序遍历的两种可行方案

方案1:抛弃null分隔符,记录每层元素数量(通用写法)

这是更规范的层序遍历实现,适配所有Queue类,也避免了null的使用:

public static void levelorder(Noden root) {
    if (root == null) {
        return;
    }
    Queue<Noden> q = new PriorityQueue<>(); // 替换为ArrayDeque更高效,这里仅演示适配PriorityQueue
    q.add(root);
    
    while (!q.isEmpty()) {
        int levelSize = q.size(); // 记录当前层的元素总数
        // 遍历当前层所有元素
        for (int i = 0; i < levelSize; i++) {
            Noden curr = q.remove();
            System.out.print(curr.data + " ");
            
            if (curr.left != null) {
                q.add(curr.left);
            }
            if (curr.right != null) {
                q.add(curr.right);
            }
        }
        System.out.println(); // 每层遍历完成后换行
    }
}

⚠️ 注意:如果坚持用PriorityQueue,必须让Noden类实现Comparable<Noden>接口,否则会抛出ClassCastException——因为PriorityQueue依赖元素的排序逻辑。实际上层序遍历不需要排序,用ArrayDeque是更高效的选择。

方案2:保留分隔符逻辑,换用支持null的Queue实现

继续使用ArrayDeque或LinkedList(两者都允许存储null),不要用PriorityQueue即可。

额外优化点

你原代码中System.out.println(curr.data+" ");会导致每个元素单独换行,改为System.out.print()才能让同一层元素在一行显示,换行操作放在每层遍历完成后。

内容的提问来源于stack exchange,提问作者Ayushman Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:31:17