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

使用current临时节点遍历二叉树插入失效,如何正确执行节点赋值操作?

错误原因分析

你遇到的问题核心是Java的值传递机制导致的:
你声明的current临时变量存储的是对象内存地址的副本,直接执行current = newNode只会修改这个副本的指向,完全不会改动原二叉树中对应父节点的子节点引用,相当于你的插入操作根本没有写入到树结构里,所以打印结果自然为null。
对比你可以正常运行的addFlight方法,它的最终赋值语句是current.rightChild = newNode——这个操作是修改current指向的实际节点对象的属性,修改会直接作用到原树结构上,因此可以成功插入节点。

修正后的insertDate实现
public void insertDate(String flight, String date) {
    // 建议将current声明为方法局部变量,避免全局变量污染
    Node current = root.leftChild;
    Node newNode = new Node(date);

    while (current != null) {
        // 字符串内容比较必须用equals,==比较的是对象地址,会出现匹配失败的问题
        if (flight.equals(current.name)) {
            // 若当前航班没有挂载过日期,直接挂到左子节点
            if (current.leftChild == null) {
                current.leftChild = newNode;
                return;
            }
            // 遍历到已有的日期链表末尾
            Node dateCurrent = current.leftChild;
            while (dateCurrent.rightChild != null) {
                dateCurrent = dateCurrent.rightChild;
            }
            // 修改末尾节点的右子节点属性,完成插入
            dateCurrent.rightChild = newNode;
            return;
        }
        current = current.rightChild;
    }
}
临时节点遍历修改二叉树的通用规则
  • 定位阶段:仅用current = current.leftChild/current = current.rightChild移动临时指针,该操作只会改变临时变量的指向,不会修改原树结构
  • 赋值阶段:必须修改current.leftChild或current.rightChild属性,不能直接给current本身赋值,只有修改节点对象的属性,改动才会同步到原树
  • 额外注意:字符串内容比较必须使用equals()方法,不要用==,否则即使字符串内容一致,只要是不同对象就会判定匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:04