2017-05-14 18 views
1

私は、triNodeのcharキーとarrayListを持つTrieNodeというクラスを持っています。私はトライを実装しようとしています。再帰的メソッド内のjava-loop

構造:例えば

something like this

ルートキーがあります ''子供たちはt、o、s、pです。キー 's'を持つノードの場合、子はtとpです。私はトライのノードの数を計算したい。私はこのアルゴリズムを使用しました

public int size(TrieNode tmp, int n){ 

    if(tmp.children.isEmpty()){ 
     return 0; 
    } 

    for(int i=0;i<tmp.children.size();i++){ 
     return 1 + size(tmp.children.get(i), n); 
    } 


    return 1; 
} 

問題は私が各呼び出しで一意ではありません。したがって、メソッドはルートで呼び出され、次に、それが子tに続いてtに続いてpまで呼び出されます。それが再びsに戻るとき、pのメソッドを呼び出さない。

これを修正するにはどうすればよいですか?

+1

なぜ再帰とループを混合していますか? –

+0

私はすべてのノードで自分のメソッドを呼び出すためにarraylistを繰り返したいからです。 –

+3

@Aominèなぜ彼はいけないのですか?ツリーがあり、すべてのノードで再帰する必要がある場合は、特定のノードのすべての子ノードをループして、それぞれのノードを再帰させてもよいと思います。 – BackSlash

答えて

1

問題は、最初の要素のループを終了することです。すべての要素を合計する場合は、親に返す前に再帰結果を合計する必要があります。このアルゴリズムのための

public int size(TrieNode tmp, int n){ 

    int sum = 0; 
    for(int i=0;i<tmp.children.size();i++){ 
     sum += size(tmp.children.get(i), n); 
    } 

    if(/* node has char n */){ 
     return sum + 1; 
    } 
    return sum ; 
} 
+0

ご協力いただきありがとうございます。 –

+0

それはスタックのためのものです。再帰的なファンクションは最初は難しいかもしれませんが、それは簡単です:) – Beri

0

使用DFS。訪問したすべてのノードは子ノードです。その子ノードにアクセスした後にその数を合計します。このようなことをしてください。

//the root is the first node to be passed on.** 
void size(TrieNode node){ 
if(node is null) return; 
if(node is not null) result.add(node); 

while(there exist childNode in node){ 
    size(childNode); 
} 
} 

結果はツリーのすべてのノードを含むArrayListです。 result.size()は、ツリー内のノードの数を示します。

関連する問題