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

向二叉搜索树添加Node时触发NullPointerException问题求助

问题分析与修复方案

核心问题1:直接调用null对象方法触发NPE

你的BinarySearchTree.add方法里直接执行root.add(root, entry),但初始状态下root是null,调用null对象的方法必然抛出NullPointerException。同时你没有接收Node.add的返回值,就算递归创建了新节点,也没法更新树的root或子节点引用。

核心问题2:递归调用未赋值,新节点无法挂载

Node.add里的递归调用add(current.left, entry)仅执行了方法,却没把返回的新节点赋值给current.left,current.right同理,导致递归创建的节点根本挂不到树上。


修复后的代码

1. 修正BinarySearchTree的add方法

需要将root作为参数传入Node.add,并把返回值重新赋值给root,这样第一次添加节点时root会被正确初始化:

public void add(Entry entry) {
    // 接收add方法返回值,更新root引用
    root = Node.add(root, entry);
}

这里建议把Node.add改成静态方法,因为它是基于传入的current节点操作,不需要依赖Node实例。

2. 修正Node的add方法

递归调用时必须把返回值赋值给对应的left/right节点,否则新创建的节点无法挂载到树中:

// 改为静态方法,无需依赖Node实例调用
public static Node add(Node current, Entry entry) {
    if (current == null) {
        return new Node(entry); // 直接返回新节点,让上层调用完成赋值
    } else if (current.entry.key < entry.key) {
        // 将递归返回的节点赋值给current.left
        current.left = add(current.left, entry);
    } else if (current.entry.key > entry.key) { // 补充key相等的判断,实现去重
        // 将递归返回的节点赋值给current.right
        current.right = add(current.right, entry);
    }
    // key相等时直接返回原节点,不做任何操作
    return current;
}

补充current.entry.key > entry.key的判断,避免key相等时错误进入else分支重复添加,符合你注释中“key已存在则不做任何操作”的需求。


原代码失效原因总结

  • 初始root为null时,root.add(...)直接调用null对象方法触发NPE;
  • 递归调用未赋值,新节点无法挂载到父节点的left/right引用,树结构完全没更新;
  • 原else分支未区分key相等的情况,会导致重复key错误插入右子树,违背集合去重要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:40:35