Trie,字典树,又称单词查找树、前缀树,是一种哈希树的变种。应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计。
性质:
1.根节点不包含字符,除根节点外的每一个节点都只包含一个字符。
2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3.每个节点的所有子节点包含的字符都不相同。
优点是查询快。对于长度为m的键值,最坏情况下只需花费O(m)的时间;而BST需要O(m log n)的时间。
本文用C++实现了字典树的
建立,插入,遍历,查找,删除节点,删除字典树,统计含有指定前缀的单词数等功能。
着重讲述下列功能的实现。
插入单词的实现:
1).设置当前节点为根节点,设置当前字符为插入字符串中的首个字符;
2).在当前节点的子节点上搜索当前字符,若存在,则将当前节点设为值为当前字符的子节点;否则新建一个值为当前字符的子节点,并将当前结点设置为新创建的节点。
3).将当前字符设置为串中的下个字符,若当前字符为0,则结束;否则转2.
4).结束时,把最后一个节点(即此时的当前节点)的isEnd设为true,对应下图中的黑色节点。表示该节点是一个单词的结尾。
查找单词的实现:
过程和插入单词非常类似,这里不再赘述。
删除单词的实现:
首先查找待删除字符串,将路径上的节点一个个入栈(本文用递归实现)。
1:若途中某个字符找不到,则不删除。
2:若到达了字符串的末尾的下一个位置,说明字符串中所有字符均找到,把包含字符串最后一个字符的那个节点设为(isEnd = false),表明到该位置不是一个单词的结尾了。
如果保存字符串中最后那个字符的节点是个叶子节点(即childCnt为0),则删除该点。
接下来便一层一层往上返回,判断当前节点是删除还是保留:
若当前节点孩子为0(childCn