Example #1
0
			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);
    }
}