Java 使用拆分操作时Treap中的Stackoverflow
我正在用Java做一个TreapJava 使用拆分操作时Treap中的Stackoverflow,java,algorithm,data-structures,Java,Algorithm,Data Structures,我正在用Java做一个Treap public class Treap { private class Pair<T> { private T first; private T second; public Pair(T first, T second) { this.first = first; this.second = second; }
public class Treap {
private class Pair<T> {
private T first;
private T second;
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public T getSecond() {
return second;
}
}
private int key;
private int priority;
private Treap leftSon;
private Treap rightSon;
public Treap(int key) {
this.key = key;
this.priority = PriorityGenerator.getPriority();
}
public Pair<Treap> split(Treap treap, int key) {
if (treap == null)
return new Pair<>(null, null);
if (key > treap.key) {
Pair<Treap> pair = split(treap.rightSon, key);
treap.rightSon = pair.first;
pair.first = treap;
return pair;
}
else {
Pair<Treap> pair = split(treap.leftSon, key);
treap.leftSon = pair.second;
pair.second = treap;
return pair;
}
}
}
公共类Treap{
私有类对{
私人T优先;
二等兵;
公共对(T第一,T第二){
this.first=first;
这个秒=秒;
}
公共T getFirst(){
先返回;
}
公共T getSecond(){
返回第二;
}
}
私钥;
私人优先权;
私人叛逆左派;
私权;
public-Treap(int-key){
this.key=key;
this.priority=PriorityGenerator.getPriority();
}
公共对拆分(Treap-Treap,int-key){
if(treap==null)
返回新对(null,null);
如果(密钥>策略密钥){
Pair Pair=split(treap.rightSon,key);
treap.rightSon=pair.first;
pair.first=treap;
返回对;
}
否则{
Pair Pair=split(treap.leftSon,key);
treap.leftSon=pair.second;
pair.second=treap;
返回对;
}
}
}
问题是split方法有时会导致Stackoverflow异常。但它有时工作正常。我真的不明白问题出在哪里。有人能帮我解决这个问题吗?我不知道您在哪里定义了
insert
方法。但是,当堆栈(嵌套方法调用)太高时,会发生StackOverflowerError
,这是使用递归算法的一个缺点。insert方法使用split,抱歉,键入insert而不是splt是的,我知道,问题是它有时工作正常,有时不正常。您想要拆分的Treap
的大小是多少,最终导致SOE
?此错误通常由太多递归调用引起。由于极限有点大,它通常是由设计缺陷引起的,而不是实际需要达到实际极限。我看不出你的代码是无限循环的,除非其中一个孩子作为孩子拥有它的一个祖先。请将所有相关代码添加到问题中,以重现问题。