字典树Trie,又称为前缀树Prefix tree,是一个26叉树,用于在一个集合中检索一个字符串,或者字符串前缀。
Trie树的两个部分:
- Node类
- 判断当前节点是否是某个字符串的结尾
- 根据字符,查找后继节点
- 类方法
- 插入字符串
- 字符串查询
代码
class Node:
def __init__(self, is_leaf=False):
self.chicd = {}
self._is_leaf = is_leaf
@property
def is_leaf(self):
return self._is_leaf
@is_leaf.setter
def is_leaf(self, is_leaf):
self._is_leaf = is_leaf
def put(self, key, value):
self.chicd[key] = value
def get_next_node(self, _str):
if len(_str) != 1:
return None
return self.chicd.get(_str, None)
def get_node(self, key):
return self.chicd.get(key, None)
class Trie:
def __init__(self):
self.root = Node()
def insert(self, _str):
cur = self.root
for c in _str:
if cur.get_next_node(c) is None:
cur.put(c, Node())
cur = cur.get_node(c)
else:
cur = cur.get_next_node(c)
cur.is_leaf = True
def query(self, _str):
cur = self.root
for c in _str:
if cur.get_next_node(c) is None:
return False
cur = cur.get_next_node(c)
return cur.is_leaf
if __name__ == "__main__":
trie = Trie()
trie.insert('abcda')
trie.insert('absde')
trie.insert('eecdab')
trie.insert('wemo')
trie.insert('azhu')
print(trie.query('wemo'))
print(trie.query('ab'))
print(trie.query('jun'))