特点
是一种树形结构,是一种哈希树的变种
应用于统计,排序和保存大量的字符串(但不限于字符串)。
利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高
性质
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符;
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
- 每个节点的所有子节点包含的字符都不相同。
实现字典树存储字符串
// 记录前缀树的根节点
TreeNode root;
// 定义前缀树节点
class TreeNode{
TreeNode[] next;
boolean isEnd;
public TreeNode (){
next = new TreeNode[26];
}
}
// 初始化前缀树
public Trie() {
root = new TreeNode();
}
// 插入
public void insert(String word) {
TreeNode cur = root;
for(char ch : word.toCharArray()){
// 判断对应节点是否为空,如果为空,则直接插入
if(cur.next[ch - 'a'] == null){
cur.next[ch - 'a'] = new TreeNode();
}
// 继续插入下一个节点
cur = cur.next[ch - 'a'];
}
// 将最后一个字符设置为结尾
cur.isEnd = true;
}
// 查找单词
public boolean search(String word) {
TreeNode cur = root;
for(char ch : word.toCharArray()){
// 如果对应节点为空,则表明不存在这个单词,返回false
if(cur.next[ch - 'a'] == null)
return false;
cur = cur.next[ch - 'a'];
}
// 检查最后一个字符是否是结尾
return cur.isEnd;
}
// 查找前缀
public boolean startsWith(String prefix) {
TreeNode cur = root;
for(char ch : prefix.toCharArray()){
if(cur.next[ch - 'a'] == null)
return false;
cur = cur.next[ch - 'a'];
}
return true;
}
}