实现Trie(前缀树)
- 互联网
- 2025-07-21 19:07:02

一、题目
Trie(发音类似try)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现Trie类: 1、Trie()初始化前缀树对象。 2、void insert(String word)向前缀树中插入字符串word。 3、boolean search(String word)如果字符串word在前缀树中,返回true(即,在检索之前已经插入);否则,返回false。 4、boolean startsWith(String prefix)如果之前已经插入的字符串word的前缀之一为prefix,返回true;否则,返回false。
示例: 输入:["Trie", "insert", "search", "search", "startsWith", "insert", "search"] [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出:[null, null, true, false, true, null, true]
Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 True trie.search("app"); // 返回 False trie.startsWith("app"); // 返回 True trie.insert("app"); trie.search("app"); // 返回 True1 <= word.length, prefix.length <= 2000 word和prefix仅由小写英文字母组成 insert、search和startsWith调用次数 总计 不超过3 * 104次
二、代码字典树: Trie,又称前缀树或字典树,是一棵有根树,其每个节点包含以下字段: 1、指向子节点的指针数组children。对于本题而言,数组长度为26,即小写英文字母的数量。此时children[0]对应小写字母a,children[1]对应小写字母b,…,children[25]对应小写字母z。 2、布尔字段isEnd,表示该节点是否为字符串的结尾。
插入字符串: 我们从字典树的根开始,插入字符串。对于当前字符对应的子节点,有两种情况: 1、子节点存在。沿着指针移动到子节点,继续处理下一个字符。 2、子节点不存在。创建一个新的子节点,记录在children数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符。
重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾。
查找前缀: 我们从字典树的根开始,查找前缀。对于当前字符对应的子节点,有两种情况: 1、子节点存在。沿着指针移动到子节点,继续搜索下一个字符。 2、子节点不存在。说明字典树中不包含该前缀,返回空指针。
重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符。
若搜索到了前缀的末尾,就说明字典树中存在该前缀。此外,若前缀末尾对应节点的isEnd为真,则说明字典树中存在该字符串。
class Trie { private Trie[] children; private boolean isEnd; public Trie() { children = new Trie[26]; isEnd = false; } public void insert(String word) { Trie node = this; for (int i = 0; i < word.length(); i++) { char ch = word.charAt(i); int index = ch - 'a'; if (node.children[index] == null) { node.children[index] = new Trie(); } node = node.children[index]; } node.isEnd = true; } public boolean search(String word) { Trie node = searchPrefix(word); return node != null && node.isEnd; } public boolean startsWith(String prefix) { return searchPrefix(prefix) != null; } private Trie searchPrefix(String prefix) { Trie node = this; for (int i = 0; i < prefix.length(); i++) { char ch = prefix.charAt(i); int index = ch - 'a'; if (node.children[index] == null) { return null; } node = node.children[index]; } return node; } }时间复杂度: 初始化为O(1),其余操作为O(∣S∣),其中∣S∣是每次插入或查询的字符串的长度。 空间复杂度: O(∣T∣⋅Σ),其中∣T∣为所有插入字符串的长度之和,Σ为字符集的大小,本题Σ=26。
实现Trie(前缀树)由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“实现Trie(前缀树)”