V* SearchRecursive(Node* node, K k) { if(node == nullptr) return nullptr; if(k == node->key) return &node->value; else if(k < node->key) return SearchRecursive(node->left, k); else return SearchRecursive(node->right, k); }
// Recursively searches the trie for queryword. previous row contains the edit distance for the string upto this trie node. void SearchRecursive(struct Trie_Node *node, char *queryword, int *previous_row, int length) { int current_row[length+1]; current_row[0] = previous_row[0]+1; int min_current_row = current_row[0]; int ins_cost, del_cost, repl_cost; int i; // computes edit distance for this node. for(i = 1; i <= length; i++) { ins_cost = current_row[i-1]+1; del_cost = previous_row[i]+1; if(node->c == queryword[i-1]) repl_cost = previous_row[i-1]; else repl_cost = previous_row[i-1]+1; current_row[i] = minimum(ins_cost, del_cost, repl_cost); if(min_current_row > current_row[i]) min_current_row = current_row[i]; } if(node->is_word == 1 && current_row[length] < MIN_COST) { MIN_COST = current_row[length]; } // only if the min of current row is < MIN_COST, search further. This prunes the search. if(min_current_row < MIN_COST) { for(i = 0; i <= 25; i++) { if(node->children[i] != NULL) SearchRecursive(node->children[i], queryword, current_row, length); } } }
// Search the trie from the root node void SearchTrie(char *queryword) { int length = strlen(queryword); int current_row[length+1]; int i = 0; for(i = 0; i <= length; i++) { current_row[i] = i; } for(i = 0; i <= 25; i++) { if(root->children[i] != NULL) SearchRecursive(root->children[i], queryword, current_row, length); } }