字典树:
以下是官方解释
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
实现方法:
搜索字典项目的方法为:
(1) 从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;
(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。
(4) 迭代过程……
(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。
其他操作类似处理
开始贴代码
这个是起始时:
#define MAX 256//ascii码有256个字符,故每棵树的子节点最多有256个
#define MAXLEN 256//单词最长为256
typedef struct TrieNode
{
int count;
struct TrieNode *next[MAX];
}TrieNode;
重点看一哈这个插入函数,这个思想有点趣;
void Insert(char *word,TrieNode *root)
{
int i;
TrieNode *cur;
if(word[0]=='\0')//字符 与 数字的转化 ,通过Ascal 码表
return;
cur=root;
for(i=0;word[i]!='\0';i++)
{
if(cur->next[word[i]]==NULL)
{
TrieNode *newNode = (TrieNode *)malloc(sizeof(TrieNode));
memset(newNode,0,sizeof(TrieNode));
cur->next[word[i]]=newNode;
}
cur=cur->next[word[i]];
}
cur->count++;//单词结束的地方放一个**标志**,表示从根节点遍历到这就是一个单词
return;
}
//所以思想就是把单词一个一个字母,然后拆开一个一个的存到树里,注意**字母是什么是靠孩子节点编号通过Acscal吗表转来的**,一个父节点下面的最多有256个孩子。
下面是其他函数
//插入一个单词
//创建树输入每个单词,以回车结束,则单词被插入树中,碰到*停止树的创建
void Construct(TrieNode *&root)
{
char inStr[MAXLEN];
int size=0;
root = (TrieNode *)malloc(sizeof(TrieNode));
memset(root,0,sizeof(TrieNode));
while(1)
{
scanf("%s",inStr);
if(strcmp(inStr,"*")==0)
break;
Insert(inStr,root);
}
return;
}
//遍历整棵树
void Traverse(TrieNode *curP)
{
static char theWord[MAXLEN];
static int pos=0;
int i;
if(curP==NULL)
return;
if(curP->count)
{
theWord[pos]='\0';
printf("%s:%d\n",theWord,curP->count);
}
for(i=0;i<MAX;i++)
{
theWord[pos++]=i;
//从这句话可以看出在递归调用子节点前,子节点的值已经加入到单词中了
Traverse(curP->next[i]);
pos--;
}
return;
}
//查找一个单词是不是在树中
bool Find(TrieNode *root,char *word)
{
int i;
TrieNode *cur;
cur=root;
for(i=0;word[i]!='\0';i++)
{
if(cur->next[word[i]]==NULL)
{
return false;
}
cur=cur->next[word[i]];
}
if(cur->count)
return true;
else
return false;
}