📅  最后修改于: 2023-12-03 14:49:51.872000             🧑  作者: Mango
Trie 是一种非常有效的数据结构,用于实现字典。它可以快速地查找单词,还可以打印出字典中所有可能的单词组合。
Trie,也叫字典树,是一种树形结构。Trie 的每个节点都代表一个字符,它的子节点代表下一个字符。
通常情况下,Trie 的根节点代表一个空字符,如果在一个 Trie 中插入了单词 "abc",那么树的结构如下:
root
/
a
/
b
/
c
这个 Trie 具有以下属性:
因此,使用 Trie 可以快速地查找单词,还可以打印出字典中所有可能的单词组合。
这里给出使用 Python 实现 Trie 的基本步骤:
TrieNode 类代表 Trie 的节点。它包含两个属性:
children
表示所有子节点is_word
标记该节点是否为单词的结尾class TrieNode:
def __init__(self):
self.children = {}
self.is_word = False
Trie 类代表整个 Trie。它包含一个属性 root
,表示 Trie 的根节点。
class Trie:
def __init__(self):
self.root = TrieNode()
插入单词的基本思路是,从 Trie 的根节点开始,逐个查找单词的字符是否存在于子节点中,如果不存在则插入一个新的节点。
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word: str) -> None:
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_word = True
搜索单词的基本思路是,从 Trie 的根节点开始,逐个查找单词的字符是否存在于子节点中,如果存在则继续向下查找,否则返回 False。
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word: str) -> None:
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_word = True
def search(self, word: str) -> bool:
node = self.root
for char in word:
if char not in node.children:
return False
node = node.children[char]
return node.is_word
在 Trie 中搜索带有特定前缀的单词的方法与搜索整个单词的方法相似,唯一的区别是在 Trie 的底部找到的节点不一定是单词的结尾。
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word: str) -> None:
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_word = True
def search(self, word: str) -> bool:
node = self.root
for char in word:
if char not in node.children:
return False
node = node.children[char]
return node.is_word
def starts_with(self, prefix: str) -> bool:
node = self.root
for char in prefix:
if char not in node.children:
return False
node = node.children[char]
return True
Trie 的迭代法思路为在整个 trie 数中,提取 key,并进行深度优先查找,如果 words 中存在该单词,则将其添加到 result 返回数组中
class Trie:
def __init__(self):
self.children = {}
self.is_word = False
def insert(self, word: str) -> None:
node = self
for c in word:
if c not in node.children:
node.children[c] = Trie()
node = node.children[c]
node.is_word = True
def getWords(self, prefix):
result = []
cur_node = self
for c in prefix:
if c not in cur_node.children:
return result
cur_node = cur_node.children[c]
stack = [(cur_node, prefix)]
while stack:
node, prefix = stack.pop()
if node.is_word:
result.append(prefix)
for letter, child_node in node.children.items():
stack.append((child_node, prefix+letter))
return result
使用 Trie 实现字典,可以快速查找单词,预测下一个可能的单词,以及打印出所有可能的单词组合。实现 Trie 的基本步骤是定义 TrieNode 类,定义 Trie 类,插入单词,搜索单词,以及前缀搜索。