Я построил три суффикса, дерево, содержащее все суффиксы строки, где каждый узел содержит только один символ, с SuffixNode в конце каждого пути, который содержит местоположения суффиксов в строке.
Допустим, в моем дереве содержатся слова "Cat", "Car" и "Can", и я хочу найти "Ca", в результате должно быть возвращено 3 суффиксных узла, поскольку строка поиска находится в 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;
}
Node:
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>();
}
}