class TreeNode:
def __init__(self):
self.children = defaultdict(TreeNode)
self.is_end=False
class Trie:
def __init__(self):
self.root = TreeNode()
def insert(self, word: str) -> None:
cur =self.root
for i in word :
if i not in cur.children:
cur.children[i]=TreeNode()
cur=cur.children[i]
cur.is_end= True
def search(self, word: str) -> bool:
cur =self.root
for i in word :
if i not in cur.children:
return False
cur=cur.children[i]
return cur.is_end
def startsWith(self, prefix: str) -> bool:
cur =self.root
for i in prefix :
if i not in cur.children:
return False
cur=cur.children[i]
return True
# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)
from collections import defaultdict # 导入 defaultdict
class TrieNode:
"""Trie (前缀树) 的节点"""
def __init__(self):
# 使用 defaultdict 来存储子节点。
# defaultdict 的参数是 TrieNode 类本身。
# 当我们尝试访问一个不存在的字符键时,
# 它会自动调用 TrieNode() 来创建一个新的子节点,
# 并将其与该字符关联起来。
self.children = defaultdict(TrieNode)
# 标记当前节点是否是一个完整单词的结尾
self.is_end = False
# --- 如何在 Trie 类中使用这个 TrieNode ---
class Trie:
def __init__(self):
"""
初始化前缀树对象。
只需要创建一个根节点即可。
"""
self.root = TrieNode() # 根节点本身不代表任何字符
def insert(self, word: str) -> None:
"""
向前缀树中插入字符串 word。
"""
current_node = self.root
# 遍历单词中的每个字符
for char in word:
# 移动到下一个节点。
# 如果 char 对应的子节点不存在,defaultdict 会自动创建新的 TrieNode。
current_node = current_node.children[char]
# 单词遍历结束后,将最后一个字符对应的节点的 is_end 标记为 True
current_node.is_end = True
def search(self, word: str) -> bool:
"""
如果字符串 word 在前缀树中 (作为一个完整的单词存在),返回 true;否则,返回 false。
"""
current_node = self.root
for char in word:
# 如果路径中某个字符不存在于子节点中
if char not in current_node.children:
return False # 单词肯定不存在
# 移动到下一个节点
current_node = current_node.children[char]
# 单词遍历结束后,必须检查最后一个节点的 is_end 标记是否为 True
return current_node.is_end
def startsWith(self, prefix: str) -> bool:
"""
如果之前已经插入的字符串 word 的前缀之一为 prefix,返回 true;否则,返回 false。
"""
current_node = self.root
for char in prefix:
# 如果路径中某个字符不存在于子节点中
if char not in current_node.children:
return False # 前缀不存在
# 移动到下一个节点
current_node = current_node.children[char]
# 只要前缀的所有字符都能在树中找到路径,就返回 True
return True
# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)