我的二叉搜索树(BST)实现中的insert()方法存在什么问题?
问题诊断
- 值传递逻辑错误:Java 只有值传递,你在
insertRec方法内对形参current直接赋值current = newNode,仅会修改当前方法栈中的局部变量副本,完全不会修改原树的root属性或者父节点的left/right属性,该赋值对原树没有任何实际效果。 - 插入方向逻辑错误:大小比较对应的插入方向写反:当
current.compareTo(newNode) > 0时,说明当前节点值大于新节点,新节点应该插入到当前节点的左子树,而非右子树;反之小于的时候才需要插入右子树。
修复方案
将递归方法改为返回节点类型,通过返回值把新节点/修改后的节点赋值给父节点的对应指针,同时修正插入方向即可,修复后代码如下:
public class BST<E extends Comparable<E>> { private class BSTNode implements Comparable<BSTNode> { public E data; public BSTNode left; public BSTNode right; public BSTNode(E data) { this.data = data; } @Override public int compareTo(BSTNode o) { return this.data.compareTo(o.data); } } public BSTNode root; public void insert(E data) { root = insertRec(root, new BSTNode(data)); } private BSTNode insertRec(BSTNode current, BSTNode newNode) { if (current == null) { return newNode; } if (current.compareTo(newNode) > 0) { // 当前节点更大,新节点插入左子树 current.left = insertRec(current.left, newNode); } else if (current.compareTo(newNode) < 0) { // 当前节点更小,新节点插入右子树 current.right = insertRec(current.right, newNode); } // 节点值相等的情况默认不插入重复值,直接返回原有节点 return current; } }
内容的提问来源于stack exchange,提问作者guest
相关产品推荐
相关产品推荐

