# 实现Trie树

·  阅读 895

Trie树（发音同“try”），又称为前缀树、字典树，从名字来看，它首先是一种树形的结构，“前缀”、“字典”等字样表明其存储的是数据的前缀，像字典一样，可以实现快速的查找。

• 搜索建议

• IP路由，最长前缀匹配

• 输入法-预测

# 实现Trie树

``````private static class TrieNode {
char c;
boolean isEnd;
TrieNode[] children;
}

``````class Trie {

private TrieNode root;

/** Initialize your data structure here. */
public Trie() {
root = new TrieNode('/', false);
}

/** Inserts a word into the trie. */
public void insert(String word) {
if (word == null || word.length() == 0) {
return;
}
TrieNode p = root;
for (int i = 0; i < word.length(); i++) {
int idx = word.charAt(i) - 'a';
if (p.children[idx] == null) {
p.children[idx] = new TrieNode(word.charAt(i), false);
}
p = p.children[idx];
}
p.isEnd = true;
}

/** Returns if the word is in the trie. */
public boolean search(String word) {
TrieNode node = searchNode(word);
return node != null && node.isEnd;
}

/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
return searchNode(prefix) != null;
}

private TrieNode searchNode(String word) {
if (word == null || word.length() == 0) {
return null;
}
TrieNode p = root;
for (int i = 0; i < word.length(); i++) {
int idx = word.charAt(i) - 'a';
if (p.children[idx] == null) {
return null;
} else {
p = p.children[idx];
}
}
return p;
}

private static class TrieNode {
char c;
boolean isEnd;
TrieNode[] children;
public TrieNode(char c, boolean isEnd) {
this.c = c;
this.isEnd = isEnd;
children = new TrieNode[26];
}
}
}

• 添加字符串

• 查找字符串前缀是否存在

• 查找字符串是否存在

# 和哈希表的对比

Trie树在以下特定的情况下，会有优势：

• 字符串包含的字符集不能太大，字符串数量比较大；
• 字符串前缀重合度比较高，这样可以节省存储空间；
• 查找前缀匹配的字符串，而不是精确查找