Trie 树(前缀树或字典树)是一种高效处理字符串集合的树形数据结构,核心思想是通过共享公共前缀来优化存储和查询。以下是 Trie 树的详细介绍:
1. Trie 树的基本概念
-
结构特点:
- 每个节点表示一个字符。
- 从根节点到某一节点的路径构成一个字符串。
- 根节点为空字符,不存储实际内容。
- 叶子节点(或标记节点)表示字符串的结束。
-
示例:
存储字符串["apple", "app", "banana"]
的 Trie 树结构:
2. Trie 树的核心操作
插入操作
- 从根节点开始。
- 逐个字符遍历待插入字符串:
- 如果字符存在于当前节点的子节点中,移动到该子节点。
- 否则,创建新节点并添加到当前节点的子节点。
- 在字符串末尾标记结束。
查找操作
- 从根节点开始。
- 逐个字符遍历待查字符串:
- 如果字符不在当前节点的子节点中,返回
False
。
- 如果字符不在当前节点的子节点中,返回
- 遍历完成后,检查最后一个节点是否被标记为结束。
删除操作
- 先查找字符串是否存在。
- 从叶子节点向上回溯,删除无分支的节点,直到遇到有多个子节点的节点或根节点。
3. Trie 树的优缺点
优点
- 高效前缀匹配:快速查找所有以某前缀开头的字符串(如搜索提示)。
- 避免重复存储:共享公共前缀,节省空间。
- 时间复杂度稳定:插入、查询、删除的时间复杂度均为 O(n)(n 为字符串长度)。
缺点
- 空间开销大:每个字符占用一个节点,可能浪费内存(尤其是字符集大时)。
- 实现复杂:需要处理动态节点分配和指针操作。
4. Trie 树的变体与优化
-
压缩 Trie 树
- 合并单分支路径,减少节点数量(如将
a -> p -> p
合并为app
)。 - 牺牲部分插入/删除效率,优化空间。
- 合并单分支路径,减少节点数量(如将