ノードを使用してデータを格納するSplay Treeクラスを実装しました。このクラスでは、ノードのデータを単一リンクリストに変換しようとしました。 1,000,000のノードがスプレイツリーに挿入され、完全に動作します。再帰を使用すると、ツリーに1,000,000のノードが含まれている場合、StackOverFlowエラーが発生します。しかし、ツリーに約15000のノードが含まれている場合、問題なくリンクされたリストに変換することができます。ここSplay Treeの1,000,000ノードをSinglyLinkedListに変換するときのStackOverFlowエラー
私はこの方法
@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());
}
の機能をテストするために以下の試験を通過し、このテストクラスを使用するスプレー木のクラス内
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);
}
}
ある私のToListメソッドメソッドのコードであります入力されたサイズは約15000ですが、それより大きい数値はStackOverFlowErrorを表示します
このエラーは回線で発生しますaddToList(node.left, list);
ノードのデータをtxtファイルに出力するために同じ再帰手法を使用すると、StackOverFlowエラーがなく、データが完全に印刷されるので、これは本当に奇妙です。
私はIn Order Traversal、PreOrder、PostOrderを使用しようとしましたが、1,000,000ノードでも同じエラーが表示されます。私はそれが再帰をあまりにも深くやっている可能性があり、スタックがメモリ不足になることを知っています。その場合、ノードのスプレイツリーをリンクリストに変換する方法はありますか? 何が間違っている可能性がありますか?歓声