2012-03-17 6 views
3

私は、文字列内の接尾辞の位置を含む各パスの末尾にSuffixNodeを持つ、各ノードがただ1文字を含む文字列のすべての接尾辞を含むツリーtrieを構築しました。ツリー/トライを検索するときに複数のノードを返す?

私のトライに「Cat」、「Car」、「Can」という単語が含まれていて、「Ca」を検索したい場合、検索文字列は3つの異なる場所。私は "Ca"のツリーを検索することができましたが、その点に達すると、すべての接尾辞ノードを見つけるために 'a'ノードの子をどのように横断するのかわかりません。

私はいくつかの種類のコレクションを使用して接尾辞ノードを追加してからコレクションを返すことを考えていました。このアプローチは理にかなっているのですか?

私は以下の検索問題を解決しました。それは任意のノードを返していなかった理由は、ツリーの作成とノードの間の違いに関係しています:

public void SearchTrie(Node parent, String s, List<SuffixNode> suffixes) 
    { 
     Node n = FindNode(parent, s); 
     FindSuffixes(n, suffixes); 
    } 

    private void FindSuffixes(Node parent,List<SuffixNode> suffixes) 
    {    
     if (parent is SuffixNode) 
     { 
      suffixes.Add((SuffixNode)parent); 
     } 
     else 
     { 
      foreach (KeyValuePair<char, Node> child in parent.children) 
      { 
       FindSuffixes(child.Value, suffixes); 
      } 
     } 
    } 

    private Node FindNode(Node parent, String s) 
    { 
     if ((s.Length == 1) && parent.children.ContainsKey(s[0])) 
     { 
      Node n = parent.children[s[0]]; 
      return n; 
     } 

     while (s[0].ToString() != "") 
     { 
      if (parent.children.ContainsKey(s[0])) 
      { 
       if ((s.Length > 1)) 
       { 
        return FindNode(parent.children[s[0]], s.Substring(1)); 
       } 

      } 
      else 
      { 
       break; 
      } 

     } 

     return null; 
    } 

ノード:私はいくつかの並べ替えを使用して考えていた

class Node 
{ 
    public char label; 
    public Node parent; 
    public Dictionary<char,Node> children; 

    public Node(Node NewParent, char NewLabel) 
    { 
     this.parent = NewParent; 
     this.label = NewLabel; 
     children=new Dictionary<char,Node>(); 
    } 
} 
+1

いくつかのコード/例を掲載してください。質問を理解するのに役立つかもしれません。なぜなら、IMOは単にサブツリー(「CA」以下)をトラバースする必要があるからです。 – digEmAll

+0

これは私がやろうとしていることですが、少し難しいと感じています。私は以前の検索機能を掲載します。他のコードは便利でしょうか? – Matt

+0

Nodeクラスも投稿できますか? – digEmAll

答えて

3

コレクションを使用してサフィックスノードを追加し、コレクションを返します。

これが最初の選択です。

...より良い解決法がありますか?

、発信者

  • yield return
  • でイテレータブロックを使用しかし、W/O特別な要件、埋めることにより、供給リストを埋める

    • のような他のソリューションがありますが、 List<string>とし、IEnumerable<string>と返します。

    関連する問題