实现 Trie (前缀树)
2026年4月23日大约 2 分钟
实现 Trie (前缀树)
使用的方法
哈希表
解题思路
- Trie(前缀树)是一种树形数据结构,用于高效地存储和查询字符串集合。每个节点表示一个字符,路径表示一个字符串。我们可以使用哈希表来存储每个节点的子节点,以便快速访问。
- 在实现 Trie 时,我们需要定义一个 TrieNode 类来表示每个节点。每个 TrieNode 包含一个哈希表来存储子节点,以及一个布尔值来标记当前节点是否是一个完整单词的结尾。
- Trie 类包含一个根节点,并提供三个主要方法:insert、search 和 startsWith。
- insert 方法用于将一个单词插入到 Trie 中。我们从根节点开始,逐个字符地检查单词中的字符。如果当前节点的子节点中没有该字符,我们就创建一个新的 TrieNode 并将其添加到子节点中。最后,我们将最后一个节点的 isEnd 标记为 true,表示这是一个完整单词的结尾。
- search 方法用于检查 Trie 中是否存在一个完整的单词。我们从根节点开始,逐个字符地检查单词中的字符。如果在任何时候我们发现当前节点的子节点中没有该字符,我们就返回 false。最后,我们检查最后一个节点的 isEnd 标记,如果为 true,表示该单词存在于 Trie 中。
- startsWith 方法用于检查 Trie 中是否存在以给定前缀开头的单词。我们从根节点开始,逐个字符地检查前缀中的字符。如果在任何时候我们发现当前节点的子节点中没有该字符,我们就返回 false。最后,如果我们成功地遍历了整个前缀,返回 true,表示存在以该前缀开头的单词。
代码实现
class Trie {
// 定义前缀树节点
class TireNode {
HashMap<Character,TireNode> children = new HashMap<>();
boolean isEnd = false;
}
// 定义根节点
TireNode root = null;
public Trie() {
root = new TireNode();
}
public void insert(String word) {
TireNode cur = root;
char[] arr = word.toCharArray();
for(int i = 0;i < arr.length;i++ ){
char c = arr[i];
if(cur.children.containsKey(c)){
cur = cur.children.get(c);
} else {
cur.children.put(c,new TireNode());
cur = cur.children.get(c);
}
if(i == arr.length - 1){
cur.isEnd = true;
}
}
}
public boolean search(String word) {
if(word.equals("")){
return true;
}
TireNode cur = root;
char[] arr = word.toCharArray();
for(int i=0; i<arr.length;i++){
char c = arr[i];
if(!cur.children.containsKey(c)){
return false;
} else {
cur = cur.children.get(c);
}
}
return cur.isEnd;
}
public boolean startsWith(String prefix) {
TireNode cur = root;
char[] arr = prefix.toCharArray();
for(int i=0;i < arr.length;i++){
char c = arr[i];
if(!cur.children.containsKey(c)){
return false;
} else {
cur = cur.children.get(c);
}
}
return true;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/