前缀树—Trie
1 概念
前缀树是一种数据结构,用于检索字符串数据集中的键。这种数据结构广泛应用于自动补全、拼写检查以及最长前缀的匹配等地方。
前缀树与哈希表有些类似,我们可以很快的查询到该集合中是否存在某个字符串。但是前缀树有哈希表所没有的特点,那就是可以快速的获取到具有公共前缀的多个字符串。
2 基本思想
2.1 节点结构
前缀树节点的结构特点:每个节点具有当前对应的一个字符值,链接的下一个节点。以全是小写字母为例,一个节点可能有26个子节点,所有前缀树是一个多叉树。还有一个布尔值表示当前节点是否是某个字符串的最后一个字符。
代码表示如下:
class TrieNode {
//子节点数组
private TrieNode[] links;
//子节点的数量(根据字符数量而定,这里可以表示字符串中只包含26个小写或者大写字母)
private final int R = 26;
//当前节点是否是字符串的最后一个字符
private boolean isEnd;
}
2.2 节点的插入
我们从节点的插入开始一点点了解前缀树的基本结构。
首先假设我们有一个单词word,将该单词插入到一个前缀树中。我们要让前缀树尽可能多的表示不同单词,故根节点应该不能代表某个字符值。根节点的值应该为空但是有多个子节点,根节点下的子节点才能赋值为某个单词的第一个字符。具体我们可以看插入的整个流程。
在进行节点的插入前需要先实现前缀树节点类,该类定义封装了前缀树节点必要的属性和方法。
class TrieNode {
//子节点数组
private TrieNode[] links;
//子节点的数量(根据字符数量而定,这里可以表示字符串中只包含26个小写或者大写字母)
private final int R = 26;
//当前节点是否是字符串的最后一个字符
private boolean isEnd;
//初始化
public TrieNode()