1.前缀树(Trie Tree)
1.1 字符串生成前缀树的过程
字母是填在路上的,不是填在节点上的。
首先是一个空的头结点:
加入“abc”到这棵树中:
头结点有到a的路吗?没有,添加:
有a到b的路吗?没有,添加,c也一样:
接着添加字符串“bce”:
添加字符串“abd”:
添加字符串“bef”:
在添加N个字符串之后,可以查询,“某个字符串是否是以“be”开始的”。
若要查询“是否含有字符串“be”?”,原始的树结构,不足以实现这个功能。
- 添加了“bef”,但是“be”的路径和“bef”的路径是重合的,无法判断有没有加过“be”。
需在节点处添加一个值,表示有多少个字符串是以这个字符结尾的。更改之后的树结构如下图:
此时b-e中e后面的节点值为0,说明没有加过"be"。
此树结构还可以查某个字符串加过几次。
“给出有多少个字符串以给定的额字符串作为前缀”——需要再加一个数据项:每一个节点被划过了多少次。
上述树结构,更改之后如下图所示:
添加字符串的代价:字符串本身的长度,和数据量N无关;
查某个字符的代价:字符串本身的长度,和数据量N无关;
1.2 代码实现
package Tree;
public class TrieTree {
public static void main(String[] args) {
Trie trie = new Trie();
System.out.println(trie.search("hello"));
trie.insert("hello");
System.out.println(trie.search("hello"));
trie.delete("hello");
System.out.println(trie.search("hello"));
trie.insert("hello");
trie.insert("hello");
trie.delete("hello");
System.out.println(trie.search("hello"));
trie.delete("hello");
System.out.print