使用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
相关产品推荐
相关产品推荐

