字典树(Trie)
字典树(Trie)常用于字符串的查找,字符串出现的次数
常用于字符串的查找,字符串出现的次数。
类似HASH_MAP(也是常用于数据的查找,数据出现的次数)
Trie树的基本性质可以归纳为:
(1)根节点不包含字符,除根节点意外每个节点只包含一个字符(每个节点由统计单词前缀出现的次数 ,26个子指针指向子树和标记该结点处是否构成单词构成)。
- typedef struct Trie_node
- {
- int count; // 统计单词前缀出现的次数
- struct Trie_node* next[26]; // 指向各个子树的指针
- bool exist; // 标记该结点处是否构成单词
- }TrieNode , *Trie;
(2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
(3)每个节点的所有子节点包含的字符串不相同。
(4)如果字符的种数为n,则每个结点的出度为n,这也是空间换时间的体现,浪费了很多的空间。
(5)插入查找的复杂度为O(n),n为字符串长度。
基本思想(以字母树为例):
1、插入过程
对于一个单词,从根开始,沿着单词的各个字母所对应的树中的节点分支向下走,直到单词遍历完,将最后的节点标记为红色,表示该单词已插入Trie树。
2、查询过程
同样的,从根开始按照单词的字母顺序向下遍历trie树,一旦发现某个节点标记不存在或者单词遍历完成而最后的节点未标记为红色,则表示该单词不存在,若最后的节点标记为红色,表示该单词存在。