前言
字典树又称单词查找树,它是一种树形结构,是一种哈希树的变种,典型应用是用于统计,保存大量的字符串(但不仅限于字符串),统计以是否有以某字符串最为前缀的字符串,有的话有多少,某字符串出现了多少次等,所以经常被搜索引擎系统用于文本词频统计。
它与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。它的优势是,利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表还高,当数据足够庞大时,会发现她比传统的字符串统计要快很多。
它有三个基本性质:
(1)根节点不存储字符
(2)除根节点外每一个节点都只存储一个字符
(3)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。
下边我将把我实现的代码和大家分享一下,代码几乎每行都有详细注释,大家一看就清除明了了,时间原因,就不再用多余的文字再追加详述了。
创建字典树
package Trie;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.CharMatcher;
/**
* 字典树类
*
* @author chenleixing
*/
public class Trie {
//各个节点的子树数目即字符串中的字符出现的最多种类
private final int SIZE = 26;
//除根节点外其他所有子节点的数目
private int numNode;
//树的深度即最长字符串的长度
private int depth;
//字典树的根
private TrieNode root;
/**
* 初始化字典树
*/
public Trie() {
this.numNode=0;
this.depth=0;
this.root = new TrieNode();
}
/**
* 字典树节点类,为私有内部类
*/
private class TrieNode {
// 所有的儿子节点或者一级子节点
private TrieNode[] son;
// 有多少字符串经过或到达这个节点,即节点字符出现的次数
private int numPass;
// 有多少字符串通过这个节点并到此结束的数量
private int numEnd;
// 是否有结束节点
private boolean isEnd;
// 节点的值
private char value;
/**
* 初始化节点类
*/
public TrieNode() {
this.numPass=0;
this.nu