Java 将Splay树中的1000000个节点转换为SingleyLinkedList时发生StackOverFlow错误

Java 将Splay树中的1000000个节点转换为SingleyLinkedList时发生StackOverFlow错误,java,recursion,tree,stack-overflow,Java,Recursion,Tree,Stack Overflow,我已经实现了一个Splay树类,它使用节点来存储数据。在这个类中,我尝试将节点的数据转换为单链接列表。可以将1000000个节点插入到splay树中,它可以完美地工作。使用递归,当树包含1000000个节点时,我得到一个StackOverFlow错误。但是,当树包含大约15000个节点时,它可以毫无问题地转换为链表 下面是我的toList方法的代码,它位于splay树类中 public LinkedList<Node> toList() { LinkedList<Nod

我已经实现了一个Splay树类,它使用节点来存储数据。在这个类中,我尝试将节点的数据转换为单链接列表。可以将1000000个节点插入到splay树中,它可以完美地工作。使用递归,当树包含1000000个节点时,我得到一个StackOverFlow错误。但是,当树包含大约15000个节点时,它可以毫无问题地转换为链表

下面是我的toList方法的代码,它位于splay树类中

public LinkedList<Node> toList() {

   LinkedList<Node> list = new LinkedList<Node>();
   Node node = root;
   addToList(node, list);

   return list;
}

private void addToList(Node node, LinkedList<Node> list) {
   if(node != null) {
      addToList(node.left, list);
      list.add(node);
      addToList(node.right, list);
   }
}
public LinkedList toList(){
LinkedList=新建LinkedList();
节点=根;
addToList(节点、列表);
退货清单;
}
私有void addToList(节点,链接列表){
如果(节点!=null){
addToList(node.left,list);
列表。添加(节点);
addToList(node.right,list);
}
}
我使用下面的这个测试类来测试这个方法的功能

@Test
public void testConversionToLinkedList {
   SplayTree<Integer,String> st = new SplayTree<Integer,String>();
   for(int i = 0; i < 1000000; i++) {
      st.insert(i, Integer.toString(i));
   }
   assertEquals(1000000, st.size());

   LinkedList<Node> list = st.toList();
   assertEquals(1000000, list.size());
}
@测试
公共无效TestConversionLinkedList{
SplayTree st=新的SplayTree();
对于(int i=0;i<1000000;i++){
st.insert(i,Integer.toString(i));
}
资产质量(1000000,st.size());
LinkedList=st.toList();
assertEquals(1000000,list.size());
}
当输入的大小约为15000时,测试通过,但是任何大于该值的数字都将显示StackOverflower错误

错误发生在行
addToList(node.left,list)处

这真的很奇怪,因为当我使用相同的递归技术将节点的数据打印到txt文件中时,没有StackOverFlow错误,数据打印得很完美

我尝试使用顺序遍历、前序和后序,但在1000000个节点上仍然收到相同的错误。我知道这可能是因为递归太深,堆栈内存不足。如果是这样的话,有什么方法可以将节点的散点树转换为链表?
知道会出什么问题吗?干杯

你的问题是递归算法。正如您所发现的,堆栈大小有一个限制,这是递归时生成的

您始终可以将递归转换为循环


下面是使用循环的DFS和BFS算法的一些示例:

您可以增加堆栈的大小。为此,必须将参数传递给jvm。 格式为-Xss[g | g | m | m | k | k]。 例如:java-xss4mYourTreeProgram