前缀树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。[百度百科]
前缀树有3个基本性质:
根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。
LeetCode中出现前缀树相关题的频率也比较高,其中208. Implement Trie (Prefix Tree)是前缀树的入门题,也是其他所有可以用前缀树解答的题的基础。
class TrieNode:
def __init__(self) :
self.end = False
self.children = [None] * 26
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word: str) -> None:
node = self.root
for c in word:
i = ord(c) - ord('a')
if not node.children[i]:
node.children[i] = TrieNode()
node = node.children[i]
node.end = True
def search(self, word: str) -> bool:
node = self.root
for c in word:
i = ord(c) - ord('a')
if not node.children[i]:
return False
node = node.children[i]
return node.end == True
def startsWith(self, prefix: str) -> bool:
node = self.root
for c in prefix:
i = ord(c) - ord('a')
if not node.children[i]:
return False
node = node.children[i]
return True