Trie(也被称为前缀树或字典树)是一种用于检索键值数据集中的键的数据结构。它是一种树形结构,常用于处理字符串检索问题,如搜索引擎和单词查找。

Trie 的基本概念

  • 节点:Trie 的每个节点代表一个字符。
  • 根节点:Trie 的起始节点,通常不包含任何字符。
  • 子节点:每个节点可以有多个子节点,代表字符串中的不同字符。
  • 前缀:从根节点到某个节点的路径上的所有字符组成的字符串。

Trie 的操作

插入

  1. 从根节点开始,依次匹配字符串中的每个字符。
  2. 如果节点不存在,则创建一个新的节点。
  3. 当匹配到字符串的最后一个字符时,标记该节点为结束节点。

搜索

  1. 从根节点开始,依次匹配字符串中的每个字符。
  2. 如果在任何位置匹配失败,则字符串不存在。
  3. 当匹配到字符串的最后一个字符时,检查当前节点是否为结束节点。

删除

  1. 从根节点开始,依次匹配字符串中的每个字符。
  2. 如果匹配成功,则递归删除该节点及其所有子节点。
  3. 在删除节点之前,检查是否还有其他字符串共享该节点,如果有,则不删除。

Trie 的应用

  • 字符串匹配:例如,在文本编辑器中查找和替换文本。
  • 搜索引擎:快速检索网页中的关键词。
  • 电话号码簿:快速查找电话号码。

示例

假设我们要将以下字符串插入 Trie 中:

apple
apply
banana

插入过程如下:

  1. 插入 "apple"

    • 根节点:a
    • a 的子节点:p
    • p 的子节点:p
    • p 的子节点:l
    • l 的子节点:e
    • e 的子节点:空(标记为结束节点)
  2. 插入 "apply"

    • 根节点:a
    • a 的子节点:p
    • p 的子节点:p
    • p 的子节点:l
    • l 的子节点:y
    • y 的子节点:空(标记为结束节点)
  3. 插入 "banana"

    • 根节点:b
    • b 的子节点:a
    • a 的子节点:n
    • n 的子节点:a
    • a 的子节点:n
    • n 的子节点:a
    • a 的子节点:空(标记为结束节点)

更多关于 Trie 的应用

Trie 树示例