关于二叉树序列化和反序列化的问题
question on serialization and deserialization in binary tree
Google 提出这个问题来设计一个序列化和反序列化二叉树的算法。我在网上找到了一种解决方案。我不太明白的部分是为什么第 20 行需要条件,其中 "if node == None:", self.root = Node(value) ?因为毕竟这个程序会提示用户以例如 1,3,5 的形式输入节点以使程序运行所以不会出现 node =none 的情况,因为用户输入是必要的?我在这里误会了吗?
class Node:
def __init__(self, value):
self.left = None
self.right = None
self.value = value
class Tree:
def __init__(self):
self.root = None
def addNode(self, node, value): #Why when node==None, self.root= Node(value)?
if node == None:
self.root = Node(value)
else:
if value < node.value:
if not node.left:
node.left = Node(value)
else:
self.addNode(node.left, value)
else:
if not node.right:
node.right = Node(value)
else:
self.addNode(node.right, value)
def serialize(root):
values = []
def serializer(node):
if not node:
values.append('?')
else:
values.append(str(node.value))
serializer(node.left)
serializer(node.right)
serializer(root)
return ','.join(values)
def deserialize(s):
values = iter(s.split(','))
def deserializer():
val = next(values)
if val == '?':
return None
else:
node = Node(int(val))
node.left = deserializer()
node.right = deserializer()
return node
return deserializer()
if __name__ == '__main__':
# Read input, numbers separated by commas
numbers = [int(n) for n in input().split(',')]
theTree = Tree()
for number in numbers:
theTree.addNode(theTree.root, number)
s1 = serialize(theTree.root)
s2 = serialize(deserialize(s1))
print(s1)
print(s2)
assert s1 == s2
在这一行中,当树中输入第一个数字时,根将为 None
for number in numbers:
theTree.addNode(theTree.root, number)
因此,需要第 20 行。
Google 提出这个问题来设计一个序列化和反序列化二叉树的算法。我在网上找到了一种解决方案。我不太明白的部分是为什么第 20 行需要条件,其中 "if node == None:", self.root = Node(value) ?因为毕竟这个程序会提示用户以例如 1,3,5 的形式输入节点以使程序运行所以不会出现 node =none 的情况,因为用户输入是必要的?我在这里误会了吗?
class Node:
def __init__(self, value):
self.left = None
self.right = None
self.value = value
class Tree:
def __init__(self):
self.root = None
def addNode(self, node, value): #Why when node==None, self.root= Node(value)?
if node == None:
self.root = Node(value)
else:
if value < node.value:
if not node.left:
node.left = Node(value)
else:
self.addNode(node.left, value)
else:
if not node.right:
node.right = Node(value)
else:
self.addNode(node.right, value)
def serialize(root):
values = []
def serializer(node):
if not node:
values.append('?')
else:
values.append(str(node.value))
serializer(node.left)
serializer(node.right)
serializer(root)
return ','.join(values)
def deserialize(s):
values = iter(s.split(','))
def deserializer():
val = next(values)
if val == '?':
return None
else:
node = Node(int(val))
node.left = deserializer()
node.right = deserializer()
return node
return deserializer()
if __name__ == '__main__':
# Read input, numbers separated by commas
numbers = [int(n) for n in input().split(',')]
theTree = Tree()
for number in numbers:
theTree.addNode(theTree.root, number)
s1 = serialize(theTree.root)
s2 = serialize(deserialize(s1))
print(s1)
print(s2)
assert s1 == s2
在这一行中,当树中输入第一个数字时,根将为 None
for number in numbers:
theTree.addNode(theTree.root, number)
因此,需要第 20 行。