public List <string> FindWordsWithPrefix(string prefix, int maxWords = int.MaxValue) { List <string> result = new List <string>(); Node prefixNode = FindNodeWithPrefix(prefix); if (prefixNode == null) { return(result); } NodeWithText root = new NodeWithText { Node = prefixNode, Text = new StringBuilder(prefix) }; foreach (NodeWithText node in IterateDepthFirst(root)) { if (node.Node.IsWord) { result.Add(node.Text.ToString()); } if (result.Count == maxWords) { break; } } return(result); }
NodeWithText GenerateNodeWithText(NodeWithText parent, char ch) { return(new NodeWithText { Node = parent.Node.Children[ch], Text = new StringBuilder(parent.Text.ToString()).Append(ch) }); }
IEnumerable <NodeWithText> IterateDepthFirst(NodeWithText root) { Stack <NodeWithText> wordsStack = new Stack <NodeWithText>(); wordsStack.Push(root); while (wordsStack.Count > 0) { NodeWithText node = wordsStack.Pop(); yield return(node); foreach (char ch in node.Node.Children.Keys) { NodeWithText newNode = GenerateNodeWithText(node, ch); wordsStack.Push(newNode); } } }
IEnumerable <NodeWithText> IterateBreadthFirst(NodeWithText root) { Queue <NodeWithText> wordsQueue = new Queue <NodeWithText>(); wordsQueue.Enqueue(root); while (wordsQueue.Count > 0) { NodeWithText node = wordsQueue.Dequeue(); yield return(node); foreach (char ch in node.Node.Children.Keys) { NodeWithText newNode = GenerateNodeWithText(node, ch); wordsQueue.Enqueue(newNode); } } }