使用一个输入参数在python中序列化二叉树

时间:2019-03-13 19:52:38

标签: python algorithm recursion

我有以下代码用于对二叉树进行序列化和反序列化

这是Interivew练习的简化版本。

我只想使用原始的python构造 无需额外的pkg加载和递归。

任何指向网站的指针都非常感谢。

我不确定该网站会继续询问更多细节。

def serialize(Node):
    """ONLY_USE_PRIMITIVE_PYTHON_CONSTRUCT_AND_RECURSION"""
    return str

def deserialize(str):
    """ONLY_USE_PRIMITIVE_PYTHON_CONSTRUCT_AND_RECURSION"""
    return Node


class Node:
    def __init__(self,data):
        self.left = None
        self.right = None
        self.data = data
    #def printTree(self):
    #    print(self.data)
    def insert(self,data):
        if self.data:
            if self.data > data :
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif self.data < data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data
    def printTree(self):
        if self.left:
            self.left.printTree()
        if self.right:
            self.right.printTree()
        print(self.data)

def serialize(Node, serial):
    if Node != None:
        serial.append(Node.data)
        serialize(Node.left, serial)
        serialize(Node.right, serial)
    else:
        serial.append('x')

def deserialize(serial):
    root = Node(None)
    ptr=0
    data_len=len(serial)

    if(data_len>0 and serial[ptr]!='x'):
        root.insert(serial[ptr])
        ptr=ptr+1
    elif (data_len==0 or serial[ptr]=='x'):
        return root


    while(ptr<data_len):
        if(serial[ptr]=='x'):
            ptr=ptr+1
        else:
            root.insert(serial[ptr])
            ptr=ptr+1

    return root

1 个答案:

答案 0 :(得分:0)

我将假设data是整数值。即使不是这种情况,修改下面的代码也不会很困难。

当然有很多方法可以序列化。如果您需要避免使用deserialize函数的第二个参数,那么如果知道正确的子项的数据从串行字符串中的哪个偏移量开始,将很有帮助。

所以这是一个建议:

def serialize(node):
    if node is None:
        return ""
    left = serialize(node.left)
    right = serialize(node.right)
    return str(node.data) + ":" + str(len(left)) + ":" + left + right

def deserialize(serial):
    if serial == "":
        return None
    data, leftsize, content = serial.split(":", 2)
    node = Node(int(data))
    node.left = deserialize(content[0:int(leftsize)])
    node.right = deserialize(content[int(leftsize):])
    return node