字典树入门,包括建树,插入以及查找
我的算法知识太差,有待提高,多看多练
描述:建立一个词库,输入若干个单词,输入以0结束
可以查询单词,返回他在词库中出现的次数,(ps:作为某个词的前缀时也算出现一次)
/* 本来以为字典树挺难的,结果看了之后感觉基础还是挺简单的 下面算法算出建立一棵字典树,输入为0表示结束 输入要查询的单词,返回字典树中这个词出现的频率 */ #include <stdio.h> #define MAX 26 //英文字母的个数 //定义字典树的节点的数据类型 typedef struct TrieNode { int nCount;//存储改节点前缀出现次数 struct TrieNode *next[MAX];//该节点的后续节点 }TrieNode; //定义存储节点的数组 TrieNode Memory[1000000];//定义一个存储字典树节点的数组 int allocp = 0;//可以看到用到下标为几的节点了,创建节点的时候用 //创建字典树 TrieNode *CreatTrie() { TrieNode *tmp = &Memory[allocp++];//tmp是指向树根的指针 tmp->nCount = 1; for(int i = 0; i < 26; i++) tmp->next[i] = NULL;//每次创建节点之后树根下面都是空的 return tmp;//返回所建立的数的树根,改树根是谁的子树,返回值就赋给谁的成员 } //在字典树中插入字符串 void InsertTrieTree(TrieNode **root, char *str) { TrieNode *tmp = *root; int i = 0, k; while(str[i]) { k = str[i] - 'a';//0-25分别代表26个英文字母 if(tmp->next[k])//如果这个词中的某个字母在相应位置出现过, { //那么相应位置的前缀数目就加1 tmp->next[k]->nCount++; } else//如果这个词在相应位置没有出现过,就在树中的相应位置加上该节点 { tmp->next[k] = CreatTrie(); } i++; tmp = tmp->next[k]; } } //查询一个字符串,返回字符串在字典中出现的次数 int SearchTrieTree(TrieNode **root, char *str) { TrieNode *tmp = *root; int i = 0, k; while(str[i]) { k = str[i] - 'a'; if(tmp->next[k]) tmp = tmp->next[k]; else return 0; i++; } return tmp->nCount;z } int main() { char s[11]; TrieNode *root = CreatTrie(); while(gets(s) && s[0] != '0') { InsertTrieTree(&root, s); } while(gets(s)) { printf("%d ", SearchTrieTree(&root, s)); } return 0; }