private static void FindRecursive(TrieNode node, ISet<string> results, string letters, string prefix, int? maxResults)
        {
            if (maxResults != null && results.Count == maxResults)
            {
                return;
            }

            if (node == null)
            {
                if (!results.Contains(letters))
                {
                    results.Add(letters);
                    return;
                }
            }

            letters += node.Letter.ToString();

            if (prefix.Length > 0)
            {
                if (node.ContainsKey(prefix[0]))
                {
                    FindRecursive(node[prefix[0]], results, letters, prefix.Remove(0, 1), maxResults);
                }
            }
            else
            {
                foreach (char key in node.Keys)
                {
                    FindRecursive(node[key], results, letters, prefix, maxResults);
                }
            }
        }
 public Trie()
 {
     RootNode = new TrieNode
     { 
         Letter = TrieNode.Root
     };
 }
        public TrieNode AddChild(char letter)
        {
            if (Children == null)
            {
                Children = new HybridDictionary();
            }

            if (!Children.Contains(letter))
            {
                if (letter != endWord)
                {
                    var node = new TrieNode(letter);
                    Children.Add(letter, node);
                    return node;
                }
                else
                {
                    Children.Add(letter, null);
                    return null;
                }
            }

            return (TrieNode)Children[letter];
        }