在计算机科学中,trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
应用场景:字符串精确搜索。
代码:
#include <iostream> #include <cstdio> #include <cstring> #define BRANCHNUM 26 using namespace std; struct Trie_Node{ bool isStr; Trie_Node* next[BRANCHNUM]; Trie_Node(){ isStr = false; memset(next, NULL, sizeof(next)); }; }; class Trie_Tree{ public: Trie_Tree(); void insert(const char* word); bool search(const char* word); void deleteTrie(const char* word); private: Trie_Node* root; }; Trie_Tree::Trie_Tree(){ root = new Trie_Node(); } void Trie_Tree::insert(const char* word){ Trie_Node* location = root; while(*word){ if(location->next[*word-'a']==NULL){ Trie_Node* temp = new Trie_Node(); location->next[*word-'a'] = temp; } location = location->next[*word-'a']; word++; } location->isStr = true; } bool Trie_Tree::search(const char* word){ Trie_Node* location = root; while(location && *word){ location = location->next[*word-'a']; word++; } return (location && location->isStr); } void Trie_Tree::deleteTrie(const char* word){ Trie_Node* location = root; while(location && *word){ location = location->next[*word-'a']; word++; if(!*word){ location->isStr = false; } } } int main(){ Trie_Tree t; //插入一个word t.insert("morgan"); t.insert("lulu"); t.insert("iloveyou"); t.insert("liu"); //删除一个word t.deleteTrie("morgan"); //查找word if(t.search("morgan")){ printf("Yes\n"); }else printf("No\n"); return 0; }
浙公网安备 33010602011771号