Trie 树

来源:互联网 发布:程序员用什么画流程图 编辑:程序博客网 时间:2024/06/06 12:38

对于 Trie的介绍可以参考下面的链接:

https://www.cs.bu.edu/teaching/c/tree/trie/


下面是代码实现:

#include <malloc.h>struct TrieNode{char key;int value;struct TrieNode *next;struct TrieNode *children;};struct Trie{struct TrieNode *root;};int g_size;void _TrieAdd(struct TrieNode **pNode, char *key){//struct TrieNode *pNode = pTrie->root;struct TrieNode *pIter = *pNode;struct TrieNode *pFound = NULL;struct TrieNode *pPrev = NULL;while(pIter != NULL){if(pIter->key == key[0]){//_TrieAdd(pNode->children, key++);pFound = pIter;break;}else{pPrev = pIter;pIter = pIter->next;}}if(pFound){if( key[0] != '\0'){_TrieAdd(&pFound->children, key + 1);}}else{struct TrieNode *pTemp = (struct TrieNode*)malloc(sizeof(struct TrieNode));pTemp->key = key[0];pTemp->children = NULL;pTemp->next = NULL;if(*pNode == NULL){*pNode = pTemp;}else {pPrev->next = pTemp;}if(pTemp->key != '\0'){_TrieAdd(&pTemp->children, key+1);}else{g_size++;}}}void TrieAdd(struct Trie* pTrie, char *key){_TrieAdd(&pTrie->root, key);}int _TrieSearch(struct TrieNode * pNode, char *key){struct TrieNode *pIter = pNode;struct TrieNode *pFound = NULL;while(pIter != NULL){if(pIter->key == key[0]){pFound = pIter;break;}pIter = pIter->next;}if(pFound){if( key[0] == '\0'){return 1;}else{return _TrieSearch(pFound->children, key+1);}}return 0;}int TrieSearch(struct Trie* pTrie, char *key){return _TrieSearch(pTrie->root, key);}int _TrieDelete(struct TrieNode *pNode, char *key, struct TrieNode* pPrev, struct TrieNode* pNext, struct TrieNode *pParent){struct TrieNode *pIter = pNode;struct TrieNode *pFound = NULL;//struct TrieNode *pTempPrev = pPrev, *pTempNext = pNext;while(pIter != NULL){if(pIter->key == key[0]){pFound = pIter;break;}pPrev = pIter;pIter = pIter->next;if(pIter){pNext = pIter->next;}else{pNext = NULL;}}if(pFound){if( key[0] != '\0'){return _TrieDelete(pIter->children, key + 1, pPrev, pNext, pIter);}else{if(/*pNext && */pPrev){struct TrieNode *pNode = pPrev->next;pPrev->next = pNext;while(pNode != NULL){struct TrieNode *pTemp = pNode;pNode = pNode->children;free(pTemp);}}else/* if(pNext)*/{struct TrieNode *pNode = pParent->children;pParent->children = pNext;while(pNode != NULL){struct TrieNode *pTemp = pNode;pNode = pNode->children;free(pTemp);}}g_size--;return 1;}}return 0;}int TrieDelete(struct Trie* pTrie, char *key){return _TrieDelete(pTrie->root, key, NULL, NULL, NULL);}int TrieSize(struct Trie *pTrie){return g_size;}int TrieModify(struct Trie *pTrie, char *from, char *to){if( TrieDelete(pTrie, from)){TrieAdd(pTrie, to);return 1;}return 0;}struct Trie g_Trie;int main(void){TrieAdd(&g_Trie, "amy");TrieAdd(&g_Trie, "ann");TrieAdd(&g_Trie, "emma");TrieAdd(&g_Trie, "rob");TrieAdd(&g_Trie, "roger");int ret = TrieSearch(&g_Trie, "ann");ret = TrieDelete(&g_Trie, "ann");ret = TrieSearch(&g_Trie, "ann");ret = TrieDelete(&g_Trie, "anx");ret = TrieDelete(&g_Trie, "rob");int size = TrieSize(&g_Trie);ret = TrieModify(&g_Trie, "emma", "mary");ret = TrieSearch(&g_Trie, "emma");ret = TrieSearch(&g_Trie, "mary");return 0;}


原创粉丝点击