Python 字典树的序列化与反序列化
字典树是一种树形结构,用于存储动态集合中的字符串,常用于实现字符串检索、字符串匹配等应用场景。字典树的节点包含一个字符值和一个指向子节点的指针数组。字典树的序列化就是将整棵树转换成一个字符串,反序列化则是将字符串转换成整棵树。
Python 中可以使用字典来实现字典树。下面是一个基本的 Python 字典树的代码实现:
class Node: def __init__(self, value=None): self.value = value self.children = {} class Trie: def __init__(self): self.root = Node() def insert(self, word): node = self.root for char in word: child = node.children.get(char) if child is None: child = Node(char) node.children[char] = child node = child node.children['$'] = Node() def search(self, word): node = self.root for char in word: if char not in node.children: return False node = node.children[char] return '$' in node.children def serialize(self): return self._serialize(self.root) def _serialize(self, node): if node is None: return '#' res = node.value for char in node.children: res += char + self._serialize(node.children[char]) res += '$' return res def deserialize(self, data): self.root = self._deserialize(iter(data)) def _deserialize(self, data): char = next(data) if char == '#': return None node = Node(char) while True: child = self._deserialize(data) if child is None: break node.children[child.value] = child return node
序列化方法 _serialize
采用前序遍历,每次把节点的字符值和每个子节点的序列化结果拼接起来,最后以 $
为结尾返回整棵树的字符串表示。反序列化方法 _deserialize
则使用迭代器解析字符串,每次读取一个字符作为当前节点的字符值,并递归构建子节点。当遇到 $
字符时表明已经递归到了当前子树的末尾,返回该节点,并由父节点添加到子节点数组中。
下面是一个示例代码:
t = Trie() t.insert("pidancode.com") t.insert("皮蛋编程") serialized_str = t.serialize() print(serialized_str) # output: 'p$pidancode.comi$皮蛋编程$' new_t = Trie() new_t.deserialize(serialized_str) print(new_t.search("pidancode.com")) # output: True print(new_t.search("皮蛋编程")) # output: True print(new_t.search("python")) # output: False
可以看到,序列化后的字符串中包含了所有节点的字符和子节点信息,反序列化后可以重建原来的字典树,并进行字符串的检索等操作。
相关文章