前缀树的功能很强大,比如有一个字符串数据,我们要从查找其中以“hell”开头的,或者以"ive"结尾的字符的个数等等操作。我们只需要在定义前缀树的时候加上相应得数据项就OK了。下面来简单通俗易懂的解释一下前缀树。
假设刚开始我们,有一个空节点,现在我们有一个操作,往这个空的节点上insert字符串“abc”, 那么我们按照下面的步骤insert:
process: 1、首先看当前节点有没有指向字符'a'的路径,没有的话就创建指向'a'的路径,否则滑过到下一个字符,同样是看看有没有到该字符的路径。一直遍历完字符,并且都创建好了路径。如下图所示:
下面介绍search 操作,假如我们要查找某一个单词是不是在这个前缀数树的结构里面呢?先贴一下代码:
public boolean search(String word) {
if (word == null) {
return false;
}
char[] chs = word.toCharArray();
TrieNode node = root; //根节点开始
int index = 0;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a'; //index 是1表示b字符。
if (node.map[index] == null) { //判断map结构里面有没有指向字符的的边
return false;
}
node = node.map[index];
}
return node.end != 0;
}
下面是表示从这棵前缀树里面删除字符
public void delete(String word) {
if (search(word)) {
char[] chs = word.toCharArray();
TrieNode node = root;
int index = 0;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if (node.map[index].path-- == 1) {
node.map[index] = null;
return;
}
node = node.map[index];
}
node.end--; //到结尾时候end--
}
}