Created
January 5, 2017 18:01
-
-
Save brun0xff/7f58f760e65ec7ae46cbe5657b71e4c1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// C implementation of search and insert operations | |
// on Trie | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <stdbool.h> | |
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) | |
// Alphabet size (# of symbols) | |
#define ALPHABET_SIZE (26) | |
// Converts key current character into index | |
// use only 'a' through 'z' and lower case | |
#define CHAR_TO_INDEX(c) ((int)c - (int)'a') | |
// trie node | |
struct TrieNode | |
{ | |
struct TrieNode *children[ALPHABET_SIZE]; | |
// isLeaf is true if the node represents | |
// end of a word | |
bool isLeaf; | |
}; | |
// Returns new trie node (initialized to NULLs) | |
struct TrieNode *getNode(void) | |
{ | |
struct TrieNode *pNode = NULL; | |
pNode = (struct TrieNode *)malloc(sizeof(struct TrieNode)); | |
if (pNode) | |
{ | |
int i; | |
pNode->isLeaf = false; | |
for (i = 0; i < ALPHABET_SIZE; i++) | |
pNode->children[i] = NULL; | |
} | |
return pNode; | |
} | |
// If not present, inserts key into trie | |
// If the key is prefix of trie node, just marks leaf node | |
void insert(struct TrieNode *root, const char *key) | |
{ | |
int level; | |
int length = strlen(key); | |
int index; | |
struct TrieNode *pCrawl = root; | |
for (level = 0; level < length; level++) | |
{ | |
index = CHAR_TO_INDEX(key[level]); | |
if (!pCrawl->children[index]) | |
pCrawl->children[index] = getNode(); | |
pCrawl = pCrawl->children[index]; | |
} | |
// mark last node as leaf | |
pCrawl->isLeaf = true; | |
} | |
// Returns true if key presents in trie, else false | |
bool search(struct TrieNode *root, const char *key) | |
{ | |
int level; | |
int length = strlen(key); | |
int index; | |
struct TrieNode *pCrawl = root; | |
for (level = 0; level < length; level++) | |
{ | |
index = CHAR_TO_INDEX(key[level]); | |
if (!pCrawl->children[index]) | |
return false; | |
pCrawl = pCrawl->children[index]; | |
} | |
return (pCrawl != NULL && pCrawl->isLeaf); | |
} | |
// Driver | |
int main() | |
{ | |
// Input keys (use only 'a' through 'z' and lower case) | |
char keys[][8] = {"the", "a", "there", "answer", "any", | |
"by", "bye", "their"}; | |
char output[][32] = {"Not present in trie", "Present in trie"}; | |
struct TrieNode *root = getNode(); | |
// Construct trie | |
int i; | |
for (i = 0; i < ARRAY_SIZE(keys); i++) | |
insert(root, keys[i]); | |
// Search for different keys | |
printf("%s --- %s\n", "the", output[search(root, "the")] ); | |
printf("%s --- %s\n", "these", output[search(root, "these")] ); | |
printf("%s --- %s\n", "their", output[search(root, "their")] ); | |
printf("%s --- %s\n", "thaw", output[search(root, "thaw")] ); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment