我尝试在python中实现二进制树的序列化/反序列化算法。在
我的代码是:
class Node:
count = 1
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def insert(self, value):
if self.value > value:
if self.left is None:
self.left = Node(value)
Node.count += 1
else:
self.left.insert(value)
else:
if self.right is None:
self.right = Node(value)
Node.count += 1
else:
self.right.insert(value)
# Using preorder
def serialize(root, serial):
if root != None:
serial.append(root.value)
serialize(root.left, serial)
serialize(root.right, serial)
else:
serial.append('x')
def deserialize(newRoot, serial):
if serial[0] == 'x':
serial.pop(0)
else:
if len(serial) > 0:
newRoot = Node(serial.pop(0))
print(newRoot.value)
deserialize(newRoot.left, serial)
deserialize(newRoot.right, serial)
print("This program serializes a tree\n")
root = Node(3)
root.insert(1)
root.insert(2)
root.insert(4)
root.insert(5)
root.insert(0)
# Serialize
serial = []
serialize(root, serial)
print(serial)
# Deserialize
newRoot = Node(None)
deserialize(newRoot, serial)
print(newRoot.value)
问题是,newRoot不能通过反序列化来更新,因为python通过值传递它。我该怎么做,最好是用最优雅的方式?在C/C++中,我只需传递一个指向NeWrand的指针,它就会相应地更新。谢谢!在
您可以返回新创建的节点,并将它们指定为左节点和右节点。另外,
pop
与最后一个元素相比,pop
的开销更大,因此reverse
在开始时使用列表,然后在递归中使用它,在您的情况下会更有效。所以代码会变成:相关问题 更多 >
编程相关推荐