字典树Trie,又称为前缀树Prefix tree,是一个26叉树,用于在一个集合中检索一个字符串,或者字符串前缀。

image.png

Trie树的两个部分:

  • Node类
    • 判断当前节点是否是某个字符串的结尾
    • 根据字符,查找后继节点
  • 类方法
    • 插入字符串
    • 字符串查询

代码

  1. class Node:
  2. def __init__(self, is_leaf=False):
  3. self.chicd = {}
  4. self._is_leaf = is_leaf
  5. @property
  6. def is_leaf(self):
  7. return self._is_leaf
  8. @is_leaf.setter
  9. def is_leaf(self, is_leaf):
  10. self._is_leaf = is_leaf
  11. def put(self, key, value):
  12. self.chicd[key] = value
  13. def get_next_node(self, _str):
  14. if len(_str) != 1:
  15. return None
  16. return self.chicd.get(_str, None)
  17. def get_node(self, key):
  18. return self.chicd.get(key, None)
  19. class Trie:
  20. def __init__(self):
  21. self.root = Node()
  22. def insert(self, _str):
  23. cur = self.root
  24. for c in _str:
  25. if cur.get_next_node(c) is None:
  26. cur.put(c, Node())
  27. cur = cur.get_node(c)
  28. else:
  29. cur = cur.get_next_node(c)
  30. cur.is_leaf = True
  31. def query(self, _str):
  32. cur = self.root
  33. for c in _str:
  34. if cur.get_next_node(c) is None:
  35. return False
  36. cur = cur.get_next_node(c)
  37. return cur.is_leaf
  38. if __name__ == "__main__":
  39. trie = Trie()
  40. trie.insert('abcda')
  41. trie.insert('absde')
  42. trie.insert('eecdab')
  43. trie.insert('wemo')
  44. trie.insert('azhu')
  45. print(trie.query('wemo'))
  46. print(trie.query('ab'))
  47. print(trie.query('jun'))

image.png