static void search(BkNode node, List <string> result, string value, int distanceTolerance) { var currentDistance = LevenshteinDistance(node.Value, value); var minDistance = (long)currentDistance - distanceTolerance; var maxDistance = (long)currentDistance + distanceTolerance; if (currentDistance <= distanceTolerance) { result.Add(node.Value); } var edges = node.Edges.Where(edge => minDistance <= edge && edge <= maxDistance); foreach (var edge in edges) { search(node[edge], result, value, distanceTolerance); } }
/// <summary> /// Add a word to the tree's dictionary. /// </summary> /// <param name="value"></param> public void Add(string value) { if (_root == null) { _root = new BkNode(value); return; } int distance; var currentNode = _root; do { distance = LevenshteinDistance(currentNode.Value, value); if (distance == 0) { return; } currentNode = currentNode[distance] ?? currentNode; } while(currentNode.ContainsKey(distance)); currentNode.AddChild(distance, value); }