为什么打印没有错误就停止了?
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
}
}
}
}
我尝试在 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
}
}
}
}