1,字典树的定义
字典树又称为单词查找树,即也就是Trie查找树,是一种树形结构,同时也是哈希树的变种。典型应用是用于统计,排序以及保存大量的字符串(但是又不仅仅局限于字符串)。所以经常被搜索引擎系统。
2,字典树的数据结构
class TrieNode{
Map<Character,TrieNode> children;
boolean wordEnd;
public TrieNode(){
children = new HashMap<Character,TrieNode>();
wordEnd = false;
}
}
(1)字典树主要由两部分组成
字符+以该字符为根节点的子树作为key+value的形式存储在Map里面
wordEnd 是用来存储是否是已经找到单词或者是一个完整的单词的(或者说是查入结尾的标记)
3,字典树的单词插入
/**
* 往字典树里插入新的字符串
*/
public void insert(String word){
TrieNode node = root;
for (int i = 0;i < word.length(); i ++ ){
Character c = new Character(word.charAt(i));
if(!node.children.containsKey(c)){
node.children.put(c,new TrieNode());
}
node = node.children.get(c);
}
node.wordEnd = true;
}
简单说下执行流程
首先定义根节点,然后一个for循环以类似于深度优先的方式
依次检查每个单词的字符是否在字典树里,如果没有那么就直接新建该节点的子节点
如果存在就直接按深度优先遍历的方式依次获取相关的子树
执行完一个周期就返回true也就是最后节点否则中途返回false
4, 字典树查找相应的单词
/**
* 查找指定的字符串或者是单词,对字典树进行深度优先搜索
*/
public boolean searchword(String word){
TrieNode node = root;
for(int i = 0;i < word.length();i++){
Character c = new Character(word.charAt(i));
if(!node.children.containsKey(c)){
return false;
}
node = node.children.get(c);
}
return node.wordEnd;
}
简单描述 一下
遍历对比字符的方式,如果有不存在的字符,那么直接 返回false;
否则查询到单词的结尾那么就表示已经找到单词,直接返回尾节点的标志,具体表示就是已经找到这个单词
同时也是代表以这个字符结尾的字符串是一个插入字符串也就是完整的单词
5,匹配相关单词前缀代码
/**
* 判断某个字符串或者单词是否具有某字符串前缀
*/
public boolean startWith(String prefix){
TrieNode node = root;
boolean found = false;
for(int i=0;i<prefix.length();i++){
Character c = new Character(prefix.charAt(i));
if(!node.children.containsKey(c)){
return false;
}
node.children.get(c);
}
return true;
}
这个代码与查找类似在此不多说
六,一个完整的字典树功能的类
具有的数据结构以及属性和相关功能行为
import java.util.HashMap;
import java.util.Map;
public class Trie
{
private TrieNode root;
public Trie(){
root = new TrieNode();
root.wordEnd = false;
}
/**
* 往字典树里插入新的字符串
*/
public void insert(String word){
TrieNode node = root;
for (int i = 0;i < word.length(); i ++ ){
Character c = new Character(word.charAt(i));
if(!node.children.containsKey(c)){
node.children.put(c,new TrieNode());
}
node = node.children.get(c);
}
node.wordEnd = true;
}
/**
* 查找指定的字符串或者是单词,对字典树进行深度优先搜索
*/
public boolean searchword(String word){
TrieNode node = root;
for(int i = 0;i < word.length();i++){
Character c = new Character(word.charAt(i));
if(!node.children.containsKey(c)){
return false;
}
node = node.children.get(c);
}
return node.wordEnd;
}
/**
* 判断某个字符串或者单词是否具有某字符串前缀
*/
public boolean startWith(String prefix){
TrieNode node = root;
boolean found = false;
for(int i=0;i<prefix.length();i++){
Character c = new Character(prefix.charAt(i));
if(!node.children.containsKey(c)){
return false;
}
node.children.get(c);
}
return true;
}
}
class TrieNode{
Map<Character,TrieNode> children;
boolean wordEnd;
public TrieNode(){
children = new HashMap<Character,TrieNode>();
wordEnd = false;
}
}