2017-10-11 1 views
1

ノードを使用してデータを格納する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ノードでも同じエラーが表示されます。私はそれが再帰をあまりにも深くやっている可能性があり、スタックがメモリ不足になることを知っています。その場合、ノードのスプレイツリーをリンクリストに変換する方法はありますか? 何が間違っている可能性がありますか?歓声

答えて

0

あなたのポブレムは再帰アルゴリズムです。あなたが知っているように、スタックサイズには限界があります。これは再帰があるときに構築されます。

いつでも再帰をループに変換できます。ここ

は、ループを使用してDFSとBFSアルゴリズムのいくつかの例は以下のとおりです。Non recursive Depth first search algorithm

0

あなたは、スタックのサイズを大きくすることができます。これを行うには、パラメータをjvmに渡す必要があります。 形式は-Xss [g | G | m | M | k | K]です。 例:java -Xss4m YourTreeProgram

関連する問題