Java 使用拆分操作时Treap中的Stackoverflow

Java 使用拆分操作时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; }

我正在用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 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
?此错误通常由太多递归调用引起。由于极限有点大,它通常是由设计缺陷引起的,而不是实际需要达到实际极限。我看不出你的代码是无限循环的,除非其中一个孩子作为孩子拥有它的一个祖先。请将所有相关代码添加到问题中,以重现问题。