最近写了一些关于字典树的题目,这里做个简单的整理。

字典树,又叫单词查找树,顾名思义就是查单词的(不仅仅o),和词典一样。不同的是词典是用纸做的,而字典树是用树形结构构建的。

她用来快速检索你要的内容,对于统计和大量字符串的排序是很好用的。她的好处就是让你尽可能的减少那么过分多且没必要的比较,提供高效的检索。Trie的核心是空间换时间,没错,开销不少,这可能是个缺点吧。


 首先,她的根结点仅仅是个根结点,什么都没有,可以看做是一本词典的封面,想要查询单词,先得打开封面(进入根结点)。

进入根结点后立马会看到a-z共26个结点,没错,这是给你选择的地方,根据你要查询的单词的首字母选择对应的结点(每个结点对应唯一一个字符),进入即可。

重复上述步骤,就可以得到你想要的结果(你要查询的字符串就是路径到叶子结点的总和)。

查找过程,你不会发现有重复的字母,也就是你不会在两条不同的路径上找到同一个字符串,每个节点的所有子节点包含的字符都不相同。这就是Trie的三个特性

她的存放就如这样:

Trie-Tree

当然,最上面的上面还有个根结点。最左边就是我查找abc这个字符串的过程,中间一个对应为da,最右边为dda。很明显,这个Trie只有三个字符串,只要你想,空间够大,你完全可以存放一本英文大词典~~~。(开销不少哈哈哈)


 好了,聊聊怎么建树吧。

Trie树一般有建立查询两个基本操作,删除的操作挺少见的(目前还没见过,可能是见识短吧~)。

建树的过程其实很简单,首先,树的每个结点并不是简简单单的字符,而是包含了26个字符,还有一个指针域,指向下一个字符。

 1 struct node
 2 {
 3     int cnt;
 4     char c[26];//结点所对应的字符
 5     struct node *next[26];
 6     node ()
 7     {
 8         cnt = 0;
 9         memset(next,0,sizeof(next));
10     }
11 };
12 node * root = NULL;//根结点初始为NULL
View Code

相关文章: