字典樹模板
阿新 • • 發佈:2017-07-27
nbsp spa else space iostream ins out ring eat
#include<iostream> #include<string> using namespace std; //表示next數組的長度,表示26個字母。如果字符串中有其他字符的話,應相應調整。 //如果所有的字符串都是手機號的話,那就是10了 const int MAX_NUM = 26; struct trieNode{ int i;//按需使用,本例子中表示從頭到本字符組成的前綴出現的次數 struct trieNode *next[MAX_NUM]; }; trieNode* CreateTrieNode(){ trieNode *p = newtrieNode; p->i = 1; for(int i = 0; i < MAX_NUM; i++) p->next[i] = NULL; return p; } void DelTrieTree(trieNode *p) { for(int i=0;i < MAX_NUM; i++) { if(p->next[i] != NULL) DelTrieTree(p->next[i]); } delete p; } void InsertTrieTree(trieNode **root, stringstr){ trieNode *p; if(*root == NULL){ p = CreateTrieNode(); *root = p; } else p = *root; int len = str.length(); int k; for(int i = 0; i < len; i++){ k = str.at(i) - ‘a‘; if(p->next[k] != NULL) p->next[k]->i += 1; else p->next[k] = CreateTrieNode(); p = p->next[k]; } } int SearchTrieTree(trieNode **root, string str){ trieNode *p; if(*root == NULL) return 0; p = *root; int k, len = str.length(); for(int i = 0; i < len; i++){ k = str.at(i) - ‘a‘; if(p->next[k] == NULL) return 0; p = p->next[k]; } return p->i; } int main(){ trieNode *root = NULL; InsertTrieTree(&root, "checking"); InsertTrieTree(&root, "check"); InsertTrieTree(&root, "for"); InsertTrieTree(&root, "checking"); InsertTrieTree(&root, "program"); InsertTrieTree(&root, "programmer"); InsertTrieTree(&root, "cheprogrammer"); cout << SearchTrieTree(&root, "che") << endl;//輸出3 cout << SearchTrieTree(&root, "prog") << endl;//輸出2 }
字典樹模板