普通多叉树
对于普通的多叉树,每个节点的所有子节点可能是没有任何规律的。而本题讨论的前缀树就是每个节点的 children 有规律的多叉树。
前缀树
(只保存小写字符的)前缀树是一种特殊的多叉树,它的 TrieNode 中 chidren 是一个大小为 26 的一维数组,分别对应了26个英文字符 ‘a’ ~ ‘z’,也就是说形成了一棵 26叉树。
前缀树的结构可以定义为下面这样。 里面存储了两个信息:
isEnd
表示从根节点到当前节点为止,该路径是否形成了一个有效的字符串。children
是该节点的所有子节点。
简单来说,就是用字典的方式存储和遍历26叉树。并且添加 isEnd
来标记字符串结束
class Trie {
private Trie[] children;
private boolean isEnd;
public Trie() {
children = new Trie[26];
isEnd = false;
}
public void insert(String word) {
Trie node = this;
for(int i = 0;i < word.length();i++){
int index = word.charAt(i)-'a';
if(node.children[index] == null){
node.children[index] = new Trie();
}
node = node.children[index];
}
node.isEnd = true;
}
public boolean search(String word) {
Trie node = searchPrefix(word);
return node != null && node.isEnd;
}
public boolean startsWith(String prefix) {
return searchPrefix(prefix) != null;
}
public Trie searchPrefix(String prefix) {
Trie node = this;
for(int i = 0;i < prefix.length();++i){
int index = prefix.charAt(i)-'a';
if(node.children[index] == null){
return null;
}
node = node.children[index];
}
return node;
}
}