字典树,即Trie树(踹树,读起来很舒适)
值是在边上的。不过在代码里我存储在TrieNode当中。
在我的代码中,
1.TrieNode为Trie树的内部类,表示结点。
2.结点的value存储从双亲结点到达当前结点的边上的值。
3.结点的children数组(总觉得用sons的日子一去不复返了)以char字符-'a’为下标,存储对应value的TrieNode.
4.根节点root是没有value的;判断是否可以字符串的下一个字符ch[i]为路径从当前结点cur到达它的某个孩子结点,只需看cur的children数组中有没有以ch[i]-’a’下标的元素,而不需要用到孩子结点的value值。
5.value值只在insert函数中新建孩子结点时会用到。将新建的孩子结点的value置为ch[i],而非其下标ch[i]-‘a’。
6.has函数,是查询是否完全匹配。循环平安结束后,如果终点结点的isEnd不是true,仍然返回false。这是一本只读的字典。
public class Trie {
TrieNode root;
class TrieNode{
private char value;
private boolean isEnd;
private TrieNode[] children = new TrieNode[26];
public TrieNode() {
isEnd = false;
}
}
public Trie() {
root = new TrieNode();
}
public void insert(String str) {
if(str==null||str.length()==0)return;
char[] letters = str.toCharArray();
TrieNode cur = root;
int pos;
for(int i=0;i<letters.length;i++) {
pos = letters[i]-'a';
if(cur.children[pos]==null) {
cur.children[pos] = new TrieNode();
cur.children[pos].value = letters[i];
}
cur = cur.children[pos];
}
cur.isEnd=true;
}
//在字典树中查询是否完全匹配一个指定的字符串
public boolean has(String str) {
if(str==null||str.length()==0)return false;
char letters[]=str.toCharArray();
TrieNode cur = root;
int pos;
for(int i=0;i<letters.length;i++) {
pos = letters[i]-'a';
if(cur.children[pos]==null)return false;
cur = cur.children[pos];
}
return cur.isEnd;
}
}