前缀树

132 阅读2分钟

定义

前缀树又叫做字典树或者单词查找树,给定字符串可以快速地实现该字符串是否存在于该前缀树中。

应用场景

给定一个字符串集合构建一棵前缀树,然后给一个字符串,判断前缀树中是否存在该字符串或者该字符串的前缀

基于链表的形式实现

  1. 数据结构:
// 前缀树的数据结构
private class TireNode {
    boolean val;
    TireNode[] tireNodes = new TireNode[26];
}
  • 每个节点下面都有26个节点,表示存储的26个字母,每个节点不断地向下扩展,就可以以树状的形式表示一个字符串;
  • 其中val表示前缀树中存储的某个字符串的终点,表示该字符串真正存储到前缀树中。
  1. 插入方法
// 前缀树的插入方法
public void insert(String word) {
    TireNode tireNode = root;
    for (char c : word.toCharArray()) {
        int idx = c - 'a';
        if (tireNode.tireNodes[idx] == null) {
            tireNode.tireNodes[idx] = new TireNode();
        }
        tireNode = tireNode.tireNodes[idx];
    }
    tireNode.val = true;
}

计算下标位置(表示字母的位置),然后判空,若不为空,则继续向下插入;若为空,则创建节点继续向下插入即可。

  1. 查询方法
// 前缀树的查询方法
public boolean query(String word) {
    TireNode tireNode = root;
    for (char c : word.toCharArray()) {
        int idx = c - 'a';
        if (tireNode.tireNodes[idx] == null) {
            return false;
        }
        tireNode = tireNode.tireNodes[idx];
    }
    return tireNode.val;
}

此处的关键是要返回最后节点的val值,如果为false,则表示该字符串不在前缀树中(可能是别的字符串的前缀而已),为true才表示该字符串真正存在;

  1. 查询某个字符串的最短前缀
// 查询某个字母的最短前缀
public String searchMinPrefix(String word) {
    TreeNode temp = root;
    StringBuilder stringBuilder = new StringBuilder();
    for (char c : word.toCharArray()) {
        if (temp.val) {
            return stringBuilder.toString();
        }
        int idx = c - 'a';
        stringBuilder.append(c);
        if (temp.nodes[idx] == null) {
            return word;
        }
        temp = temp.nodes[idx];
    }
}

练习题

208. 实现 Trie (前缀树)

648. 单词替换

676. 实现一个魔法字典

677. 键值映射

211. 添加与搜索单词 - 数据结构设计

745. 前缀和后缀搜索