题目
序列化是指将一个数据结构转化为位序列的过程,因此可以将其存储在文件中或内存缓冲区中,以便稍后在相同或不同的计算机环境中恢复结构。
设计一个序列化和反序列化 N 叉树的算法。
序列化/反序列化算法的算法实现没有限制。你只需要保证 N 叉树可以被序列化为一个字符串并且该字符串可以被反序列化成原树结构即可。
例如,你需要序列化下面的 3-叉 树。
为 [1 [3[5 6] 2 4]]
。你不需要以这种形式完成,你可以自己创造和实现不同的方法。
注意:
"""
# Definition for a Node.
class Node(object):
def __init__(self, val=None, children=None):
self.val = val
self.children = children
"""
import pickle
class Codec:
def serialize(self, root: 'Node') -> str:
"""Encodes a tree to a single string.
:type root: Node
:rtype: str
"""
return pickle.dumps(root)
def deserialize(self, data: str) -> 'Node':
"""Decodes your encoded data to tree.
:type data: str
:rtype: Node
"""
return pickle.loads(data)
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
- 性能有点差
方案二
"""
# Definition for a Node.
class Node(object):
def __init__(self, val=None, children=None):
self.val = val
self.children = children
"""
class Codec:
def serialize(self, root: 'Node') -> str:
"""Encodes a tree to a single string.
:type root: Node
:rtype: str
"""
if not root:
return ""
if not root.children:
return str(root.val) + " "
ret = f"{str(root.val)} [ "
for child in root.children:
ret += self.serialize(child)
ret += " ] "
return ret
def deserialize(self, data: str) -> 'Node':
"""Decodes your encoded data to tree.
:type data: str
:rtype: Node
"""
if not data:
return None
data = data.split()
if len(data) == 1:
return Node(val=int(data[0]), children=[])
stack = [] # 保存未构建完成的 children
children = []
for token in data:
if token == "[":
stack.append(children)
children = []
elif token == "]":
before_children = stack.pop()
before_children[-1].children = children
children = before_children
else:
children.append(Node(val=int(token), children=[]))
return children[0]
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
原文
https://leetcode-cn.com/explore/learn/card/n-ary-tree/161/conclusion/627/