私は、文字列内の接尾辞の位置を含む各パスの末尾に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>();
}
}
いくつかのコード/例を掲載してください。質問を理解するのに役立つかもしれません。なぜなら、IMOは単にサブツリー(「CA」以下)をトラバースする必要があるからです。 – digEmAll
これは私がやろうとしていることですが、少し難しいと感じています。私は以前の検索機能を掲載します。他のコードは便利でしょうか? – Matt
Nodeクラスも投稿できますか? – digEmAll