Python序列化/反序列化二进制文件

2024-09-27 07:34:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在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的指针,它就会相应地更新。谢谢!在


Tags: selfrightnonenodeifvaluedefserial
1条回答
网友
1楼 · 发布于 2024-09-27 07:34:46

您可以返回新创建的节点,并将它们指定为左节点和右节点。另外,pop与最后一个元素相比,pop的开销更大,因此reverse在开始时使用列表,然后在递归中使用它,在您的情况下会更有效。所以代码会变成:

def deserialize(serial):
    serial.reverse()
    return _deserialize(serial)

def _deserialize(serial):
    if not serial:
        return None

    node = None
    value = serial.pop()
    if value != 'x':
        node = Node(value)
        node.left = _deserialize(serial)
        node.right = _deserialize(serial)
    return node

root = deserialize(serial)
print(root.value)

相关问题 更多 >

    热门问题