一、Trie树概述
1.1 定义
Trie(前缀树/字典树)是一种树形数据结构,用于高效存储和检索字符串集合。
1.2 核心特性
- 根节点表示空字符串
- 每条边代表一个字符
- 从根到节点的路径表示一个字符串前缀
二、节点结构
class TrieNode { TrieNode[] children; boolean isEndOfWord; TrieNode() { children = new TrieNode[26]; isEndOfWord = false; } }
|
三、基本操作
3.1 插入
public void insert(String word) { TrieNode node = root; for (char c : word.toCharArray()) { int idx = c - 'a'; if (node.children[idx] == null) { node.children[idx] = new TrieNode(); } node = node.children[idx]; } node.isEndOfWord = true; }
|
时间复杂度:( O(m) ),( m ) = 单词长度
3.2 查找
public boolean search(String word) { TrieNode node = searchPrefix(word); return node != null && node.isEndOfWord; }
public boolean startsWith(String prefix) { return searchPrefix(prefix) != null; }
private TrieNode searchPrefix(String prefix) { TrieNode node = root; for (char c : prefix.toCharArray()) { int idx = c - 'a'; if (node.children[idx] == null) return null; node = node.children[idx]; } return node; }
|
四、应用场景
4.1 自动补全
根据输入前缀,遍历子树收集所有单词。
4.2 最长公共前缀
public String longestCommonPrefix(String[] strs) { Trie trie = new Trie(); for (String s : strs) trie.insert(s); return trie.findLongestPrefix(); }
|
4.3 单词搜索 II
在二维字符网格中查找所有单词,先用Trie存储单词列表,再DFS网格。
五、压缩Trie
5.1 radix tree / patricia trie
合并只有一个子节点的链,减少空间。
六、总结
| 操作 |
时间 |
空间 |
| 插入 |
( O(m) ) |
( O(m \cdot n) ) |
| 查找 |
( O(m) ) |
- |
| 前缀匹配 |
( O(m) ) |
- |
Trie树以空间换时间,特别适合前缀查询频繁的场景。理解其核心思想(边代表字符,路径代表字符串),可以灵活应用于各类字符串问题。