
可以看到,Tire树是一颗多叉树,二叉树可以每个节点存储左右节点的指针,那多叉树怎么存储呢?
package StringMatch;
/*
Trie树
*/
public class Trie_zhu {
private TrieNode head = new TrieNode('/'); //头节点,存储无意义字符
static class TrieNode{
private char value;
private TrieNode[] Children = new TrieNode[26];
private boolean isEnding = false;
public TrieNode(char value){
this.value = value;
}
}
public void insert(String value){
TrieNode p = head;
char[] text = value.toCharArray();
for (int i = 0; i < text.length;i++){
int index = text[i] - 'a';
if (p.Children[index] == null){
TrieNode newNode = new TrieNode(text[i]);
p.Children[index] = newNode;
}
p = p.Children[index];
}
p.isEnding = true;
}
public boolean find(String value){
char[] text = value.toCharArray();
TrieNode p = head;
for (int i = 0; i < text.length;i++){
int index = text[i] - 'a';
if (p.Children[index] == null){
return false;
}
p = p.Children[index];
}
return p.isEnding;
}
}
如果要在一组字符串中,频繁地查询某些字符串,用Trie树会非常高效,
Trie对于匹配字符串的效率是很高的,但是会比较耗内存,是一种"空间换时间"的思路
在一组字符串中查找某个字符串,Trie树表现的并不好,它对要处理的字符串有极其严苛的要求
因此,这种问题更适合用红黑树或散列表来解决
Trie树的优势在于查找前缀匹配的字符串,比如浏览器中输入object,会跳出相关选项

还包括一些自动输入补全,比如输入法自动补全功能、IDE代码编辑器自动补全等