为什么打印没有错误就停止了?

Why does the printing stop with no errors?

我尝试在 for 循环中打印 boolean insert(K) 的结果,但在第一次插入后打印停止,这表明第二次插入未完全成功。

在 insert(K) 方法内部,调用 retrieves(K) 方法,检查 K 是否已经插入。

    for (int i = 100; i > 0; i--) {
        System.out.println(m.insert(i +1, 22));
        System.out.println("dd");
        System.out.println(m.retrieve(i+1).first + ",,,"+m.retrieve(i+1).second);
        System.out.println(i + " insertion done");
        System.out.println("---------");
    }

结果是

-------------------
true
dd
true,,,22
100 insertion done
---------
true
dd

删除 insert() 方法中的“retrieves(K)”调用后,打印运行正常,所以我假设方法“retrieves(K)”存在问题,因为存在没有错误 + cpu 使用率更高,它可能是一个无限循环,问题是,我没有看到它。

这里是方法“retrieves(K)”

    public Pair<Boolean, T> retrieve(K k) {

    Pair<Boolean, T> ff = new Pair<Boolean, T>(false, null);
    BSTMapNode<K, T> p = root;
    if(root==null) {
        return new Pair<Boolean,T>(false,null);
    }
    else
    while (p != null) {
        if (k.compareTo(p.key) == 0) {
            ff.first=true;
            ff.second=p.data;
            return new Pair<Boolean,T>(true,p.data);
        } else if (k.compareTo(p.key) < 0) {
            p = p.left;
        } else
            p = p.right;
    }
    return new Pair<Boolean,T>(false,null);
}

编辑:添加了插入方法

public boolean insert(K k, T e) {
    BSTMapNode<K, T> p = current;
    BSTMapNode<K, T> q = current;
    // ISSUE HERE
    if (retrieve(k).first == true) {
        current = q;
        return false;
        //
    }
    BSTMapNode<K, T> tmp = new BSTMapNode<K, T>(k, e);
    if (root == null) {
        root = current = tmp;
        return true;
    } else {
        if (k.compareTo(current.key) < 0)
            current.left = p;
        else
            current.right = p;
        current = p;
        return true;
    }

问题出在 insert() 方法上。第二次调用时,root为non-null,执行进入else分支。在那里,它将 current.left = p 设置为 current == p,因此 p 现在是它自己的 p.left。当 retrieve() 方法到达该节点时,它会设置 p = p.left ,但不会发生任何变化,从而导致无限循环。

您使用 current 节点的方法无效。在insert()中,每次都要从根开始查找新节点的插入位置,与retrieve()中的做法类似。继续往下走,直到你到达一片叶子。然后在那里插入新节点。

代码可能如下所示:

public boolean insert (K key, T value) {
    if (root == null) {
        root = new BSTMapNode<>(key, value);
        return true;
    } else {
        BSTMapNode<K, T> p = root;
        while (true) {
            if (key.compareTo(p.key) == 0) {
                return false; // Already in BST
            } else if (key.compareTo(p.key) < 0) {
                if (p.left == null) {
                    p.left = new BSTMapNode<>(key, value);
                    return true;
                } else {
                    p = p.left;
                }
            } else {    
                // Analogous for right sub-tree
            }
        }
    }
}